C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


(過去ログ 143 を表示中)
■83719 / )  Re[1]: バイト配列から位置情報を配列に収める方法
□投稿者/ 魔界の仮面弁士 (1235回)-(2017/04/04(Tue) 16:04:41)
No83717 (しょこたん さん) に返信
> 巨大なバイト配列があり、
「バイナリファイル」ではなく、
Dim largeBinary() As Byte などといった、
メモリ上の「配列」が対象なのですね?


> そこから、例えば50という数値を検索して、

ここでいう「50」が、どのようなフォーマットであるかも重要です。

Dim b As Byte = 50 相当なら、{ &H32 } な 1 バイトを捜索すれば良いだけなので、
 Dim b As Byte = 50
 Dim pos As New List(Of Integer)()
 For n = 0 To largeBinary.GetUpperBound(0)
  If largeBinary(n) = b Then
   pos.Add(n)
  End If
 Next
あるいは
 Dim b As Byte = 50
 Dim pos As New List(Of Integer)()
 Dim p As Integer = Array.IndexOf(largeBinary, b, 0)
 While p >= 0
  pos.Add(p)
  p = Array.IndexOf(largeBinary, b, p + 1)
 End While
などで列挙できるでしょう。

List(Of ) で返却する代わりに Yield を使っても良さそうなので、
探索用の匿名メソッドを用意しておくと便利かもしれません。



問題は、検索するデータが 1 バイト未満(たとえば 0b111111 な 6bit)や、
複数バイトであった場合です。

Dim i As Integer = 50 ならば { &H32, &H0, &H0, &H0 } なバイナリを
探すことになりますし、パック10進なら { &H5, &H0, &HC } などになるでしょう。

Dim l As Long = 50L ならば、{ &H32, &H0, &H0, &H0, &H0, &H0, &H0, &H0 }
Dim f As Single = 50F ならば、{ &H0, &H0, &H48, &H42 }
Dim r As Double = 50R ならば、{ &H0, &H0, &H0, &H0, &H0, &H0, &H49, &H40 }

Dim s As String = "50" だったりすると、エンコーディング次第でさらに変化します。
UCS-2 なら { &H35, &H0, &H30, &H0 }
CP932 なら { &H35, &H30 }
EBCDIC なら { &HF4, &HF0 }
のように。


これらについては、基本的には先の応用で、先頭データを Array.IndexOf 等で探し、
それが一致したら、2 バイト目以降も一致するかを再帰的に探索することで実装できます。
返信 編集キー/


管理者用

- Child Tree -