[[20230227102432]] 『[VBA]バイナリファイルへの書き込み』(津々浦々) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『[VBA]バイナリファイルへの書き込み』(津々浦々)

初めまして。
バイナリファイルを読み込んだ後に、中身を追加して名前を変えて保存をしたいです。
読み込みと書き込んで別名で保存自体はサイトを参考にしたらできました。

J30に入力されているデータをそのままバイナリに追加したいのに
ASCIIに変換された状態で書き込まれてしまいます。
(12345と追加したいのに3132333435みたいになってしまう)
変換せずにそのままバイナリに書き込むにはどうしたらよいのかご教授ください。

 Sub bin()

    Dim inputFileName As String
    Dim inputFn As Long

    Dim buffer() As Byte

    Dim outputFileName As String
    Dim outputFn As Long

    '読み込むファイル
    inputFileName = Application.GetOpenFilename(FileFilter:="Binファイル,*.bin")

    If inputFileName = "False" Then
        MsgBox "キャンセルされました"
        End
    End If

    '空いているファイル番号
    inputFn = FreeFile

    'バイナリファイル読み込み
    Open inputFileName For Binary As #inputFn
        'ファイルの長さで配列を初期化
        ReDim buffer(LOF(inputFn))

        'ファイルをバイナリで読み込んでByte配列に格納
        Get #inputFn, , buffer
    Close #inputFn

    '書き込むファイル
    outputFileName = Left(inputFileName, Len(inputFileName) - 4) & "_a.bin"

    '空いているファイル番号
    outputFn = FreeFile

    Dim i As Long
    'バイナリファイル書き込み
    Open outputFileName For Binary As #outputFn
        Put #outputFn, , Range("J30").Value
        Put #outputFn, , buffer()
    Close #outputFn

 End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows10 >


 バイナリフィイルの仕様が分かってないとどうしようもありません

 文字列(固定長なのか不定長なのか文字コードはなにかetc)なのか
 数値なのか(整数型なのか浮動小数なのかバイト数もetc)

 例えば、の話をします 
 mp4というファイルフォーマットがあります。バイナリです。
 アプリケーションは、拡張子で判断してmp4のファイル仕様にそって中のデータを読み込みます
 mp4ファイルに仕様に則らずに勝手にデータを追加したら、動画が再生できなくなります

 まず、今使用しているバイナリデータの仕様を理解するところから始めてください。
(´・ω・`) 2023/02/27(月) 11:04:03

 ありがとうございます。
 ごめんなさい、中身の細かい仕様はわかっていません。
 書き込みたいデータはヘッダ情報として画像サイズを入れたいらしく。
 現状手作業でバイナリエディタで12345…などと書き込んでいるので、
 その作業を自動化できないかということでお願いされました。
 なので、データの追加自体には問題ないと思います。
(津々浦々) 2023/02/27(月) 11:13:19

 では、整数型だとおもうので、整数型の変数にいったん代入してから書き込めば大丈夫かな・・・?

   Dim picSize As Long
   picSize = Range("J30").Value
   Put #outputFn, , picSize

 変数の型はIntergerなのかLong型なのかLongLong型なのか・・は、そちらで判断してください
(´・ω・`) 2023/02/27(月) 11:29:17

 ああ…すみません、最初の質問の意図を理解できておりませんでした。
 HEXで書き込むので、整数型ではないです。が、整数だけの状態にして上記を試したらできたので
 一旦自分で考えて試してみます。ありがとうございます。
 試してもわからなかったらまた質問させてください。
(津々浦々) 2023/02/27(月) 11:40:27

 >HEXで書き込むので、整数型ではないです
 バイナリモードでOpenして整数型の変数を書き込むとそうなるようになっています
 コンピュータの内部的に全てHEX(というかBinary)です。
 それをそのまま書き込むのがそれがバイナリモード

 重要なのは、内部表現が整数型なのか浮動小数点型なのか文字列型なのか(とそのバイトサイズ)です

 OUTPUTモードはASCIIに変換して書き込むみます
(´・ω・`) 2023/02/27(月) 11:49:49

 このへんはなるべく厳密な表現をしようとコロロがけたつもりですが、
 ちょっと正確性に欠けるかもしれません
(´・ω・`) 2023/02/27(月) 11:50:59

 >内部表現が整数型なのか浮動小数点型なのか文字列型なのか(とそのバイトサイズ)です
 内部表現と言っているのは、ヘッダとして書き込みたい状態がどれかということでしょうか?
 現状J30のセルには"000CA402"など入っていて、実際ヘッダに書き込むのも"000CA402"を書きたいです。
 このサイズは常に4byteです。
 ただ、
 >OUTPUTモードはASCIIに変換して書き込むみます
 この仕様が効いているのか、string型の変数に代入して書き込んでも"3030304341343032"として書かれてしまう、というのが悩みでした。
(津々浦々) 2023/02/27(月) 13:02:29

 "000CA402"というのが、整数の828418のHEX表現だとすれば、
 これがJ30のセルに入っているなら、

 Dim picSize As Long
 picSize = Val("&H" & Range("J30").Value)
 Open "d:\text.bin" For Binary As #outputFn
 Put #outputFn, , picSize
 Close outputFn
 です

 Dim picSize As Long
 picSize = 828418
 Open "d:\text.bin" For Binary As #outputFn
 Put #outputFn, , picSize
 Close outputFn
 と同じ

 この辺解説するとものすごいボリュームになるので、検索してしらべください。 
(´・ω・`) 2023/02/27(月) 13:28:37

 ありがとうございます。
 逆戻ししたらいいのかな…とchrで変換しようとしたりしていましたが、
 そもそも整数型を入れると自動でHEX表現になるということの理解が浅かったです。
 実際には縦と横をそれぞれ2byteづつで取っていて「3072」と「676」が元になっていたため
 以下のようにしたら意図通りの動きになりました。
 具体的な原理についてはきちんと勉強したいと思います。
 つたない表現をくみ取ってくださりありがとうございました!

  Sub bin()

    Dim inputFileName As String
    Dim inputFn As Long

    Dim buffer() As Byte

    Dim outputFileName As String
    Dim outputFn As Long

    Dim picsizeH As Integer
    Dim picsizeV As Integer

    '読み込むファイル
    inputFileName = Application.GetOpenFilename(FileFilter:="Binファイル,*.bin")

    If inputFileName = "False" Then
        MsgBox "キャンセルされました"
        End
    End If

    '空いているファイル番号
    inputFn = FreeFile

    'バイナリファイル読み込み
    Open inputFileName For Binary As #inputFn
        'ファイルの長さで配列を初期化
        ReDim buffer(LOF(inputFn))

        'ファイルをバイナリで読み込んでByte配列に格納
        Get #inputFn, , buffer
    Close #inputFn

    '書き込むファイル
    outputFileName = Left(inputFileName, Len(inputFileName) - 4) & "_a.bin"

    '空いているファイル番号
    outputFn = FreeFile

    'バイナリファイル書き込み
    picsizeH = Range("D30").Value
    picsizeV = Range("E30").Value

    Open outputFileName For Binary As #outputFn
        Put #outputFn, , picsizeH
        Put #outputFn, , picsizeV
        Put #outputFn, , buffer()
    Close #outputFn

 End Sub
(津々浦々) 2023/02/27(月) 13:49:53

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.