• ベストアンサー

バイナリ出力

バイナリのテストデータを作成しており、VBAで作成中です。 以下の内容で困っております。 「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」 変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか? よろしくお願いします。

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

  • ベストアンサー
  • driverII
  • ベストアンサー率27% (248/913)
回答No.2

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

tks_59
質問者

お礼

早速のご回答ありがとうございます。 ・256 で割った商とあまりをBYTEまたはcharで出力する 方法で試したいと思います。 また、バイトオーダーについてのURLとても参考になりました。 ありがとうございます。

その他の回答 (3)

回答No.4

サンプルです。 下に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)
回答No.3

★補足要求します。 ・変数 long 型の値を下位 16 Bitだけを 2 バイトの情報として出力するのですか? ・それとも、上位 16 Bit、下位 16 Bitをそれぞれ 2 バイトの情報× 2 回として出力するのですか? ・さらにバイトオーダーは『ビッグ・エンディアン』か、『リトル・エンディアン』かどのようにしますか? ・単純な方法ならば、変数 short 型に long 型の下位(上位) 16 Bitを AND 処理した値を代入します。  その変数(short型)をバイナリ出力すれば良いと思いますが…。 ・以上。おわり。

tks_59
質問者

お礼

早速のご回答ありがとうございます。 ・変数 long 型の値を下位 16 Bitだけを 2 バイトの情報として出力します。が、VBAなのでShort型自体がなくて困っておりました。 ・バイトオーダーについては、対象のCPUタイプを設定する仕組みが別途ありますので、それを基に『ビッグ・エンディアン』か、『リトル・エンディアン』を判別します。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> 0~65525の値を2バイトの情報(VCでいうunsigned shortの型)として > バイナリファイルに出力する。 要するに、「&H0000」~「&HFFFF」が出力されれば良いんですよね? Integerで「0」~「32767(&H7FFF)」と、 「-32768(&H80000)」~「-1(&HFFFF)」を 出力すればよさそうですけど・・・

関連するQ&A