バイト配列から該当する文字列の先頭位置を取得したい への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 shu  (社会人)
投稿日時
2016/10/31 13:38:32
こんな感じでどうでしょう?
Dim data As String() = {"01", "00", "31", "32", "41", "42", "43", "FF", "0E", "4A"}
Dim bytData = (From s In data Select Convert.ToByte(s, 16)).ToArray
Dim strData = System.Text.Encoding.ASCII.GetString(bytData)
Dim address = strData.IndexOf("ABC")
Dim address2 = strData.IndexOf("CDE")
If address >= 0 Then
MessageBox.Show("Address = " & address)
Else
MessageBox.Show("No Match")
End If
If address2 >= 0 Then
MessageBox.Show("Address = " & address2)
Else
MessageBox.Show("No Match")
End If
投稿者 ねぼすけ  (社会人)
投稿日時
2016/10/31 12:30:51
バイト配列を16進数で表示して
{01,00,31,32,41,42,43,FF,0E,4A}
とします。
これらは、アスキーコードであれば
{・,・,1,2,A,B,C,・,・,J}
となります。
ここから、「ABC」とならんでいれば「A」の位置を取得したいと思います。
下記のように、目的は達成されますが、もっと簡単な方法はありませんか。
宜しくお願いします。
{01,00,31,32,41,42,43,FF,0E,4A}
とします。
これらは、アスキーコードであれば
{・,・,1,2,A,B,C,・,・,J}
となります。
ここから、「ABC」とならんでいれば「A」の位置を取得したいと思います。
下記のように、目的は達成されますが、もっと簡単な方法はありませんか。
宜しくお願いします。
'バイト配列準備
Dim data As String() = {"01", "00", "31", "32", "41", "42", "43", "FF", "0E", "4A"}
Dim byteData(9) As Byte
Dim i As Integer = 0
For Each dt As String In data
byteData(i) = Convert.ToInt32(dt, 16)
i += 1
Next
'ABCの位置を取得する
Dim target As String = "ABC"
Dim address As Integer = 0
Dim found As Boolean = False
For i = 0 To byteData.Length - 3
Dim s1 As String = ChrW(byteData(i))
Dim s2 As String = ChrW(byteData(i + 1))
Dim s3 As String = ChrW(byteData(i + 2))
Dim str As String = s1 & s2 & s3
If str = target Then
found = True
address = i
Exit For
End If
Next
If found = True Then
MsgBox("Address=" & address)
Else
MsgBox("Not Match!")
End If
最初、String型が20億個の文字を蓄えることができるということで
1バイトずつASCII文字に変換し、貯めていくことにしましたが、何せ5,571,109 バイト
一向に終わらなかった。それで断念しました。
Dim strData = System.Text.Encoding.ASCII.GetString(bytData)
の1行で済んだのですね。しかも、
Dim bytData = (From s In data Select Convert.ToByte(s, 16)).ToArray
でバイトデータができてしますのですね。それから、「IndexOf」勉強になりました。
shuさん、どうもありがとうございます。