[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『[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.