- ベストアンサー
バイナリ出力
バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
256 で割った商とあまりをBYTEまたはcharで出力すれば良いと思いますが。 これだけではあんまりなので、出力順の URL を張っておきます。 http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3%E3%83%87%E3%82%A3%E3%82%A2%E3%83%B3
その他の回答 (3)
- 1050 円(@1050YEN)
- ベストアンサー率69% (477/687)
サンプルです。 下にLongToByteArray関数がありますが、バイト配列を返却する関数となっています。 実際にご使用されるデータは、もっと長いデータだと思いますので、必要に適した状態に応用し、バイト配列を作成してください。 そのデータをバイナリファイルに保存するだけです。 VBでは「unsigned short」→「BYTE」に置き換えることが多いです。 別の方法としては、unsigned shortとしての値の操作をするためにロング変数を用意し、その変数はあくまでポインタとして利用して、中身にAPIで値を操作することも可能です。 Option Explicit Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (ByVal Destination As Long, ByVal Source As Long, ByVal Length As Long) Sub Main() Dim l_lngWk As Long Dim l_bytWk() As Byte l_lngWk = 65525 'バイト配列化(全体の4バイトの場合) l_bytWk = LongToByteArray(l_lngWk, 0, 4) 'バイト配列化(上位の2バイトの場合) l_bytWk = LongToByteArray(l_lngWk, 2, 2) 'バイト配列化(下位の2バイトの場合) l_bytWk = LongToByteArray(l_lngWk, 0, 2) 'バイナリ保存 Call SaveFile("C:\Binary.data", l_bytWk) End Sub '引数のロング変数をバイト配列化 'p_lngBuff :ロングのバッファ 'p_lngStart :開始位置 'p_lngLength :長さ Function LongToByteArray(ByVal p_lngBuff As Long, ByVal p_lngStart As Long, ByVal p_lngLength As Long) As Byte() Dim l_bytRet() As Byte ReDim l_bytRet(p_lngLength - 1) Call CopyMemory(VarPtr(l_bytRet(0)), VarPtr(p_lngBuff) + p_lngStart, p_lngLength) LongToByteArray = l_bytRet End Function 'バイナリ保存 Sub SaveFile(ByVal p_strPath As String, p_bytBuff() As Byte) Dim l_adoSt As Object Set l_adoSt = CreateObject("ADODB.Stream") l_adoSt.Type = 1 'バイナリ指定(ADODB.StreamTypeEnum.adTypeBinary) l_adoSt.Open l_adoSt.Write p_bytBuff l_adoSt.SaveToFile p_strPath, 2 '新規作成指定(ADODB.SaveOptionsEnum.adSaveCreateOverWrite) l_adoSt.Close Set l_adoSt = Nothing End Sub
- Oh-Orange
- ベストアンサー率63% (854/1345)
★補足要求します。 ・変数 long 型の値を下位 16 Bitだけを 2 バイトの情報として出力するのですか? ・それとも、上位 16 Bit、下位 16 Bitをそれぞれ 2 バイトの情報× 2 回として出力するのですか? ・さらにバイトオーダーは『ビッグ・エンディアン』か、『リトル・エンディアン』かどのようにしますか? ・単純な方法ならば、変数 short 型に long 型の下位(上位) 16 Bitを AND 処理した値を代入します。 その変数(short型)をバイナリ出力すれば良いと思いますが…。 ・以上。おわり。
お礼
早速のご回答ありがとうございます。 ・変数 long 型の値を下位 16 Bitだけを 2 バイトの情報として出力します。が、VBAなのでShort型自体がなくて困っておりました。 ・バイトオーダーについては、対象のCPUタイプを設定する仕組みが別途ありますので、それを基に『ビッグ・エンディアン』か、『リトル・エンディアン』を判別します。
- dsuekichi
- ベストアンサー率64% (171/265)
> 0~65525の値を2バイトの情報(VCでいうunsigned shortの型)として > バイナリファイルに出力する。 要するに、「&H0000」~「&HFFFF」が出力されれば良いんですよね? Integerで「0」~「32767(&H7FFF)」と、 「-32768(&H80000)」~「-1(&HFFFF)」を 出力すればよさそうですけど・・・
お礼
早速のご回答ありがとうございます。 ・256 で割った商とあまりをBYTEまたはcharで出力する 方法で試したいと思います。 また、バイトオーダーについてのURLとても参考になりました。 ありがとうございます。