プロが教える店舗&オフィスのセキュリティ対策術

バイナリのテストデータを作成しており、VBAで作成中です。
以下の内容で困っております。

「0~65525の値を2バイトの情報(VCでいうunsigned shortの型)としてバイナリファイルに出力する。」
変数long型で値を取得した場合、4バイトの情報としてバイナリ出力されてしまいます。これを2バイトの情報として出力する方法をご教授願えないでしょうか?

よろしくお願いします。

A 回答 (4件)

256 で割った商とあまりをBYTEまたはcharで出力すれば良いと思いますが。



これだけではあんまりなので、出力順の URL を張っておきます。

http://ja.wikipedia.org/wiki/%E3%82%A8%E3%83%B3% …
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
・256 で割った商とあまりをBYTEまたはcharで出力する
方法で試したいと思います。

また、バイトオーダーについてのURLとても参考になりました。
ありがとうございます。

お礼日時:2007/02/27 17:23

サンプルです。



下に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
    • good
    • 0

★補足要求します。


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

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

お礼日時:2007/02/27 17:21

> 0~65525の値を2バイトの情報(VCでいうunsigned shortの型)として


> バイナリファイルに出力する。

要するに、「&H0000」~「&HFFFF」が出力されれば良いんですよね?

Integerで「0」~「32767(&H7FFF)」と、
「-32768(&H80000)」~「-1(&HFFFF)」を
出力すればよさそうですけど・・・
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!