• ベストアンサー

教えてください。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等は使用不可能とお考え下さい。

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

  • ベストアンサー
  • ginyou
  • ベストアンサー率32% (138/431)
回答No.3

 >Data_A = Data_A & Hex(Data) の所を Data_A = Data_A & Right$("00" + Hex(Data), 2) と書き換えて下さい。

inugoya_poti
質問者

お礼

お答え有難うございます。 こちらの方が、強制的に0埋めするより安定するのかも。 (Format関数は結構不安定(!?)と聞いたことがあったので…) ご教授有難うございます(^o^)。

その他の回答 (2)

  • nakashi
  • ベストアンサー率51% (21/41)
回答No.2

>Data_A = Data_A & Hex(Data) Hex(Data)が0-Fのとき 前に0を追加したら

inugoya_poti
質問者

お礼

お答え有難うございます。 教えて頂いたように、 所得データに0埋めを行うことにしました。

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

エンコード・デコード で検索

参考URL:
http://oshiete1.goo.ne.jp/kotaeru.php3?q=393593
inugoya_poti
質問者

お礼

ご返答有難うございます。 実はそちらの過去ログも見たのですが、 私が扱うデータとちょっと感じが違ったので熟読していませんでした(爆)

関連する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行くらいで済みそうな気がするんですが、あまりプログラミングをやったことありません。なので、すみませんがご教授お願いいたします。

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

    現在、以下のようなプログラムでバイナリファイルを読込んでいるのですが、そのデーターの中にある文字列の位置を検索したいのですが何かよい方法は無いでしょうか、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 ---------- よろしくお願いします。

  • エクセル VBA テキストデータ書きだし

    お世話になっております。 エクセルのデータに記入したデータをテキストに書き出したいのですが、検索した結果、 A列だけテキスト化には成功したのですが、複数列(A-U)までコピーしたいのです。 シート名"メール" テキスト名"テキスト" 申し訳ございませんが、よろしくお願いします。 Sub テキスト() Dim StrFN As String StrFN = ActiveWorkbook.Path & "\テキスト.txt" Dim i As Long, LngLoop As Long Dim IntFlNo As Integer Worksheets("メール").Activate LngLoop = Range("a65536").End(xlUp).Row IntFlNo = FreeFile Open StrFN For Output As #IntFlNo For i = 1 To LngLoop Print #IntFlNo, Cells(i, "A") Next i Close #IntFlNo 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」、他の箇所も問題ないのですが… おそらくは根本的に違う方法で解決すべきではないかと思うのですがその方法がわかりません。 なお、この格納データはバイナリデータなので、意図的に全角文字にしていくてもその値によって(偶然)全角文字になったり制御文字になったりしますので前もって全角文字に対する処理は難しいと考えてます。 質問の仕方が良くなく、質問の内容がなかなかご理解いただけないとは思いますが、ご存知の方、ご経験者の方、ご教授お願いいたします。

  • 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にて対応したいと思っています。 宜しくお願い致します。

  • C言語 バイナリデータのサイズの調べ方

    windows7 64bitでcygwinを使用しています。 32bitを1つの組として、いくつかの組で構成されたバイナリデータがあります。 このバイナリデータにいくつの組があるのか調べるため、以下のようなソースを記述したのですが、うまくいきません。 どこを修正すればよろしいでしょうか。 御教授願います。 int main() { long long int i; long long int hex[1]; long long int aaaa; int bb; int ret; FILE * fp; i = 1; bb = 1; for(;;){ fp = fopen("kimi.dat", "r"); bb = fread(&hex[1],4,i,fp); aaaa = i; i = aaaa + 1; ret = fclose(fp); if (bb != aaaa) { printf("%lld\n",aaaa); printf("%lld\n",i); printf("%d\n",bb); exit(1); } } } gcc -std=c99でコンパイルしました。 結果は 1431440333 1431440334 1 のように表示されました。 データファイルは900MB以上あります。

  • VB6 「Line Input」でのリークについて

    VB6での「Line Input」命令使用時のメモリリークについて教えて下さい。 1分毎に3600行のCSVファイルを読み込むプログラムを作成しています。  (CSVファイルは1行500文字程度) 以下の【パターン1】は作成したプログラムの1部ですが、 (1)を3600回ループ時にパフォーマンスモニタでの「Private Bytes」が増加してしまいます。   (1ループ毎に増加せず、数十回ループする毎に増加します。) 試しに【パターン2】を作成し、CSVファイルはオープンのみ行い、 読み込みは行わずに、500文字の文字列が入った変数をコピーした場合は、 「Private Bytes」は増加しません。 基本的に違いは(1)と(2)の箇所だけなのですが、 「Line Input」命令の使用方法などで間違っている箇所があるのでしょうか? ご存知の方、教えて下さい。お願いします。 【パターン1】 Private Sub read_Timer() Dim i As Long Dim CsvDataBuf(3600) As String 'CSV読込み変数 Dim FP As Integer 'ファイル番号 (省略) : FP = FreeFile Open "C:\test.csv" For Input As #FP i = 0 Do While Not EOF(FP) And i <= (3600 - 1) Line Input #FP, CsvDataBuf(i)     ←(1) i = i + 1 Loop Close #FP : (省略) 【パターン2】 Private Sub read_Timer() Dim i As Long Dim CsvDataBuf(3600) As String 'CSV読込み変数 Dim tempBuf As String Dim FP As Integer 'ファイル番号 (省略) : tempBuf = "~500文字の文字列~" FP = FreeFile Open "C:\test.csv" For Input As #FP i = 0 Do While Not EOF(FP) And i <= (3600 - 1) CsvDataBuf(i) = tempBuf       ←(2) i = i + 1 Loop Close #FP : (省略)

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

    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 上のプログラムでどこで変換してるのかがわからないんです。誰か教えてください。

  • Open For Output As #nで、

    エクセルで Open For Output As #nで、 自身のファイルに文字を書き込むことはできないのでしょうか? Sub test1() Dim MyFileName As String Dim n As Long Dim i As Long, LastRow As Long MyFileName = ActiveWorkbook.FullName n = FreeFile Open MyFileName For Output As #n ‘(1) Print #n, "test" Close #n End Sub を行うと、(1)の部分で、 書き込みできません。(Error 70)になります。 エクセルに書き込む方法はいくつかありますがこの方法では書き込めないのですか? エクセルの現在のブックのシート1のセルA1に書き込みたいです。

  • エクセルのデータを大量のテキストファイルに書き込みたい。

    エクセルの縦のセルのデータ(下のCells( 4 * j + i, 4))を繰り返しで、400個のテキストファイルに書き込みたいのですが、 下の""内のjは繰り返しせずに、j.txtとなって入力されてしまいます。なにかいい方法がありませんでしょうか。 ご協力お願いします。(ちなみにvbaは初心者です。) Private Sub CommandButton2_Click() Dim n As Long n = FreeFile Dim j As Integer For j = 0 To 399 For i = 1 To 4 a = Cells( 4 * j + i, 4) f2 = ActiveWorkbook.Path & "\j.txt" Open f2 For Append As #n Print #n, a Close #n Next i Next j End Sub 例. 1 2 3 4 5 6 7 8 9 10 12 13 1,2,3,4→1.txt 5,6,7,8→2.txt 9,10,11,12→3.txt

専門家に質問してみよう