バイナリデーター内の文字を検索

このQ&Aのポイント
  • バイナリデーター内の文字を検索する方法について
  • 現在、バイナリファイルの読み込みにはfor ~ nextを使用していますが、より簡単な方法はないか探しています。
  • バイナリ.BINファイル内の特定の文字列の位置を検索する方法について教えてください。
回答を見る
  • ベストアンサー

バイナリデーター内の文字を検索

現在、以下のようなプログラムでバイナリファイルを読込んでいるのですが、そのデーターの中にある文字列の位置を検索したいのですが何かよい方法は無いでしょうか、for ~ next で廻すと一応はできますが、もう少し簡単な方法を探しています。 -------- Dim xBIN() As Byte Dim lngFileLenB As Long lngFileLenB = FileLen("バイナリ.BIN") Open "バイナリ.BIN" For Binary As #1 Get #1, , xBIN ' For i = 0 To lngFileLenB If IJP_DAT1(i) = CLng("&H" & "20") Then stop end if next i ---------- よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

excelのvbaで試したものですが・・・ バイナリの配列ならそのまま文字列に代入できませんでしたっけ? 後はinstrbで調べて、-1するのはどうですか? 以下では? ちなみに、質問のプログラムは一部不明だったんで、若干書き換えました。 Dim xBIN() As Byte Dim lngFileLenB As Long lngFileLenB = FileLen("バイナリ.BIN") ReDim xBIN(lngFileLenB) Open "バイナリ.BIN" For Binary As #1 Get #1, , xBIN ' Dim str As String str = xBIN '<-文字列に代入 Debug.Print InStrB(xBIN, ChrB(&H20)) - 1 '<-こたえ Dim i As Long For i = 0 To lngFileLenB 'If IJP_DAT1(i) = CLng("&H" & "20") Then If xBIN(i) = &H20 Then Stop End If Next i Close #1 p.s. 比較する相手を単純に"abc"とかにしたら動きませんよ。

ShiroNeko
質問者

お礼

ありがとうございます。イメージ通りの結果を得ることができました。 更に質問のバグも指摘していただきすみません。(_ _); 'If IJP_DAT1(i) = CLng("&H" & "20") Then 本当に助かりました。

関連するQ&A

  • VBA バイナリ―から文字列にする方法

    この度はお世話になります。 現在、バイナリ―ファイル(xxxx.bin)をVBAで読み込み、バイナリ―データを文字列化して、エクセルで解析できるようなシートを作っています。 バイナリ―ファイルの中身が31 39 32 31 ・・・・・となっていたら、31393231・・・と文字列化にしたいです。 そこで、自分でプログラムを考えてみたのですが、バイナリ―が 01 などの場合、など“1”として読み込まれて、“0”が入らず、ずれてしまいます。 Sub 電文解析プログラム() Dim Deciphering_file As Variant '読み込みファイル Dim buf As Byte '1バイト格納 Dim fLen As Long 'ファイルサイズ Dim TEMP(1) As String ' Dim S_JIS As String '文字コード(2バイト) Dim str As String '文字列データ Dim i As Long Deciphering_file = Application.GetOpenFilename("BINファイル(*.bin),*.bin") fLen = FileLen(Deciphering_file) Open Deciphering_file For Binary As #1 For i = 1 To fLen Get #1, i, buf S_JIS = Hex(buf) If buf = 0 Then S_JIS = "00" End If TEMP(0) = Mid(S_JIS, 1, 1) TEMP(1) = Mid(S_JIS, 2, 1) str = myChr & TEMP(0) & TEMP(1) Next i End Sub ホントは3行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

  • バイナリの高速読み取り

    vb2005でバイナリデータを16進数で読み込みたいのですが、 Dim br As New System.IO.FileStream("フルパス",IO.FileMode.Open, IO.FileAccess.Read) Dim strbyte As String For I As Integer = 0 To CType(br.Length, Integer) - 1 strbyte = Hex(br.ReadByte).ToString If strbyte.Length = 1 Then strbyte = "0" & strbyte End If TextBox1.Text = TextBox1.Text & " " & strbyte Application.DoEvents() Next とか、他に Dim arByte() As Byte = My.Computer.FileSystem.ReadAllBytes("フルパス") Dim obyte As Byte Dim strbyte As String For Each obyte In arByte strbyte = Hex(obyte).ToString If strbyte.Length = 1 Then strbyte = "0" & strbyte End If TextBox1.Text = TextBox1.Text & " " & strbyte Application.DoEvents() Next なんかも試してみたのですが、ぜんぜん読み込みが遅くて困っています。 なんか高速にバイナリデータを16進数で読み込む方法がありましたら教えてください。(一般のバイナリエディタ並に)

  • VBAでバイナリデータが上手く読めない。

    VBAでバイナリデータが上手く読めない。 もともとC言語でバイナリデータを加工していた事をVBAでやる事になったのですが、上手く読めない。 <VBA> Open inputFileName For Binary As #mFileNo のようにオープンして、 <VBA> Dim a(800) As Byte Get #1, , a のように記述すればC言語のように取得出来ると思ったのですが、上手く取得出来ません。 なんとなく分かった事ですが、800バイトの中に改行文字があった場合、そこまでを変数aに入れるようにすると出来そうなので、Getで改行コードがあった場合はそこまでを読み込むみたいな手段はありますでしょうか。inputだとデータがまったく見れませんでしたのでGetにて対応したいと思っています。 宜しくお願い致します。

  • VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいの

    VB(VBA)で、バイナリデータを使ってテキストファイルを作成したいのですが、 例えば、"A"が一文字のみのShift-JIS もしくはunicodeのテキストファイルを作るため、 (下記の確認はShift-jis で行っています。) Dim ByteData As Byte ByteData = AscW("A") Open "C:\A.txt" For Binary Access Write As #1 Put #1, 1, ByteData Close #1 としました。 できあがったファイルをバイナリエディタで確認すると、  41 となっています。 (Unicode は 41 00 2バイト文字でリトルエンディアンのため) この41は、"A" の文字コード(Shift-JIS)「65」の16進表記です。 この「41」という値を使ってバイナリモードでテキストファイルを作成したいのですが、 どのようにすればよいでしょうか? 上記 Put #1, 1, ByteData の部分を、 1.Put #1, 1, 41 としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「29 00 20 20」でした。 文字コード00 に該当する文字がないためだと思います。 2.Put #1, 1, "41" としたところ、「41 」(バイナリモードで 「34 31 20 20」) (41の後ろは半角空白) で×でした。 3.Put #1, 1, CLng("&H" & 41) としたところ、通常表示はできないファイルができあがったみたいです。 バイナリモードで 「41 00 00 00」でした。 4.ByteData = CLng("&H" & 41) Put #1, 1, ByteData これでやっとできました。 この他にも方法があるのか?と思い、質問させていただきました。 ご指導よろしくお願いいたします。

  • バイナリデータのファイル

    FILE *stream1; if( (stream1 = fopen( argv[2], "rb" )) == NULL ) printf( "Can not open plane text file.\n"); /////////////////////////////////////////////////////////////////// // 平文 fseek(stream1, 0, SEEK_END); long filelen = ftell(stream1); fseek(stream1,0,0); int head = sizeof(long); mesLength = filelen + head; int baseByte = kk / 8 + ((kk % 8)?1:0); // 鍵バイト長 int mesByte = baseByte - 1; // 処理単位バイト数(暗号化ではbyte減らしておく) //暗号化 if(mesLength <= mesByte*20){//63が暗号化の作業サイズ *20= bufp = (char*)new(char[filelen +1+ int(kk/8 + 2)+head]); if(bufp == NULL){ cout << "No Memory" <<"\n"; cout.flush(); return(-1); } // 平文 *(long *)bufp = filelen; int i = head; do{ c = fgetc(stream1); bufp[i]=c; i=i+1; }while(c!=EOF); bufp[i-1]=NULL; for(int j=0; j<(kk/8+2); j++){ bufp[j+i] = NULL; } mesLength = i-1; // 平文長(バイト) + head 上のように、古い形でファイルを扱っています。 wchar_t を基本にプログラムを書き換えようとしていますが、 ファイルの扱いで、上記の部分と似たような扱いがしやすいのは、 _wfopen CreateFile の、どちらでしょうか? バイナリファイルが扱いやすいもの、8ビットごとの操作が可能なものを探しています。 それとも、あきらめて古いままのほうが良いのでしょうか? よろしくご指導下さい。

  • 教えてください。VBでのバイナリデータ。

    EUCコードで作成されたlndatファイルをオープンし、 コード変換するプログラムを作っています。 データの所得時にHexを使っているのですが、 所得データが 000000000000000000220801011200012000 となっています。 元データは 000000000000000000000000000000000000220080010001012000000120000000000000 なため、この様に所得したいのですが、上手く所得できません。 こういったデータの所得は可能なのでしょうか? また、自分の作成したソース自体にバグがあるのでしょうか? よろしかったら教えてください。 >>以下ソース Dim Data As Byte     '所得データ(1バイトごと) Dim Data_A As Variant 'ファイルから所得したデータ(ALL) Dim I As Long 'カウンター Dim File_Name As String 'ファイル名 Dim Filnm As Long 'ファイル番号 I = 1 Data_A = "" Filnm = FreeFile File_Name = "AA.lndat" Open App.Path & File_Name For Binary As #Filnm Do While EOF(Filnm) = False Get #Filnm, I, Data Data_A = Data_A & Hex(Data) I = I + 1 Loop Close #Filnm >>開発環境 VB5.0(SP3) Win2000 フリーのDLL等は使用不可能とお考え下さい。

  • 【VB6.0】ファイルからサイズの大きいバイナリデータを読み込む際にエラー

    はじめまして。 初投稿の新米プログラマです。 VB6.0で多種類のファイルをバイナリデータとして読み込んで 返却する関数を作成しています。 '------------------------------------- ' ファイルからバイナリデータを読み込む '------------------------------------- private Function GetBinaryData(ByVal strFileName As String) As Byte() On Error GoTo Exception Dim fileNo As Integer Dim fileSize As Long Dim bytData() As Byte 'ファイルのサイズを取得する fileSize = FileLen(strFileName) ReDim bytData(fileSize - 1) 'バイナリデータ読み込み fileNo = FreeFile Open strFileName For Binary Access Read As fileNo Get #fileNo, , bytData Close #fileNo '戻り値の設定 GetBinaryData = bytData Exit Function 'エラー処理 Exception: MsgBox (CStr(Err.Number) & " " & Err.Description) End Function ですが、↑の関数にサイズの大きなファイル(100M程度)を指定したとき  ReDim bytData(fileSize) で、「メモリが不足しています」というエラーが発生してしまいます。 発生の仕方としては、'エラー処理のMsgBoxで表示されることも ありますし、プログラムが停止することもありますし、 On Error GoToを記述しているのにも関わらず VBのメッセージボックスが表示されることもあります。  #[継続][終了][デバッグ][ヘルプ]のボタンが出ているやつです。 ちなみに、50M程度のファイルであれば読み込めています。 このエラーが発生する原因は何なのでしょうか? また、解決方法(サイズの大きなファイルを確実に読み込む方法)は あるのでしょうか? 解決方法がないのであれば、「○M以上のファイルはエラー」という 仕様にしようと思うのですが、 何Mまでなら確実に読み込むことが出来るのでしょうか? …もしくは上のコーディング自体、検討違いでしょうか^^;  #バイト配列の要素数に上限があるとか…? とても困っています… どうかよろしくお願い致します。

  • さっきのバイナリ→テクスト

    FP1 = FreeFile Open Text1.Text For Binary As #FP1 FP2 = FreeFile Open Text3.Text For Output As #FP2 Do While (Not (EOF(FP1))) For i = 1 To 128 Get #FP1, , Bwk(i) Next i flg = 0 If j(1) <> "" Then Swk = Right("00" & Trim(Hex(Bwk(1))), 2) & Right("00" & Trim(Hex(Bwk(2))), 2) For i = 1 To 5 If j(i) <> "" Then If j(i) = Swk Then flg = 1 Exit For End If End If Next i Else flg = 1 End If If flg = 1 Then Swk = "" For i = 1 To 128 Swk = Swk & Right("00" & Trim(Hex(Bwk(i))), 2) Next i Print #FP2, Swk End If Loop Close MsgBox "完了" End Sub 上のプログラムでどこで変換してるのかがわからないんです。誰か教えてください。

  • バイナリデータの取り方

    VB6を使用して、バイナリファイルをバイナリデータとして文字列にとりたいのですが、全角文字が絡んだ時の処理がうまくいきません。 バイナリファイルをString型の変数に丸ごと読み込んで、後は何バイトから何バイト目を抜き取り数値に変換…という処理をしようとしています。 本来は、バイナリでファイルをオープンして、Getコマンドで取得するのが手っ取り早いのですが、ファイルアクセス回数を減らすため、このような面倒な方法をとっております。 そこで仮に、 dim test as string dim i as integer test = "aあ" & chr(1) & "0 " For i = 1 to 6 Debug.Print Asc(Strconv( _ MidB(Strconv(test,vbFromUnicode),i,1), _ vbUnicode)) Next のようなソースを作ってみました。(本来は文字列は数100KByte…) しかしながら、この方法ですと上の例では2Byte目、つまり「あ」の文字の1Byte目が「&H00」になってしまいます。その次は「&HA0」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • For~Nextステートメント  途中で止めるには

    For~Nextステートメント で、変数が5なら止めたいのですがIFを使わない方法があったと思うのですが、 忘れてしまいました。 今は、 +++++++++++++++++++++++++++++ Sub test() Dim i As Long For i = 2 To 10 If i = 5 Then Stop End If Next End Sub +++++++++++++++++++++++++++++ としていますが、 If i = 5 Then Stop End If じゃなくても、一つのメソッドで出来た気がするのですが、 わかる方いらっしゃいますか? ご回答よろしくお願いします。

専門家に質問してみよう