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

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

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

Re[2]: バイト配列から位置情報を配列に収める方法


(過去ログ 143 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■83717 / inTopicNo.1)  バイト配列から位置情報を配列に収める方法
  
□投稿者/ しょこたん (1回)-(2017/04/04(Tue) 15:22:15)

分類:[.NET 全般] 

巨大なバイト配列があり、
そこから、例えば50という数値を検索して、
それらの位置情報を配列に収めたいのですが
どのようなコードを書けば良いですか?
50が存在する数は不明だとします。

できれば,
VB.NETでのコードを教えてください
よろしくお願いいたします。






引用返信 編集キー/
■83718 / inTopicNo.2)  Re[1]: バイト配列から位置情報を配列に収める方法
□投稿者/ shu (1000回)-(2017/04/04(Tue) 16:02:03)
No83717 (しょこたん さん) に返信

巨大とか関係なく配列の全要素を見なければならないのなら
配列の最初から最後まで1つづつ確認していくのがよいかと思います。
For Each を使って、indexは0から1づつ足していくのがよいでしょう。

速度的な改善を考えるなら配列をいくつかに分けて考えそれぞれを別の
スレッドで同時に探すと効果があると思います。


引用返信 編集キー/
■83719 / inTopicNo.3)  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 バイト目以降も一致するかを再帰的に探索することで実装できます。
引用返信 編集キー/
■83731 / inTopicNo.4)  Re[2]: バイト配列から位置情報を配列に収める方法
□投稿者/ しょこたん (2回)-(2017/04/04(Tue) 19:15:51)
No83719 (魔界の仮面弁士 さん) に返信


どうもありがとうございます。
パーフェクトでした。
 
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -