|
■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 バイト目以降も一致するかを再帰的に探索することで実装できます。
|