バイト配列の読み出し

解決


キョウイチ  2008-04-15 15:40:06  No: 139538  IP: 192.*.*.*

Integerの値を固定したデータ数だけ記録してあるバイナリファイルがあります。  現在は

Dim ariA(42000) as Integer
Dim i as integer
Dim F 
Dim FNam as string
Dim L as Long
Dim B() as byte
Dim P as integer

FNam="C:\MyVB\Sample.dat"
L = 40000
Redim B(l+1)
F = Freefile

Open Fnam for Binary as #F
For i = 1 to L
   P = i * 2 - 1
   Get #F, P, ariA(i)
Nect i
Close #f

のように1データ毎に読んでいます。これをバイト配列にして一括して読み込んでからIntegerの配列にしてみたいと思います。バイト配列からどのようにしてIntの数値を取り出すか方法が分からないので教えてください。

編集 削除
やじゅ  2008-04-15 21:06:43  No: 139539  IP: 192.*.*.*

VB6だとして(VB.NetはIntegerは4Byteなので×です)
http://7ujm.net/VB/str_integer.html

編集 削除
K.J.K.  2008-04-16 10:02:11  No: 139540  IP: 192.*.*.*

まず、処理を見直すべきかと。
Cなどと異なり、VB6にはポインタのキャストという概念やそれを行う仕組みが
存在しません。そのため、このようなことを実装しようとすれば面倒なことを
しなければなりません。

で、エラー処理を省略すると、

Private Declare Sub CopyMemory _
    Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef Dest As Any, ByRef Src As Any, _
 Optional ByVal Length As Long = 4&)

Private Declare Sub CopyMemoryFromSafeArray _
    Lib "kernel32.dll" Alias "RtlMoveMemory" _
(ByRef RetPointer As Long, ByRef SrcArray() As Any, _
 Optional ByVal Length As Long = 4&)

Private Declare Function SafeArrayAllocDescriptor Lib "oleaut32.dll" _
(ByVal Dimensions As Long, ByRef RetArray() As Any) As Long

Dim arIntegers() As Integer
Dim arBytes() As Byte
Dim iIntegerCount As Long
Dim iByteCount As Long
Dim pSafeArray As Long

' ここまでにarBytes、iIntegerCount、iByteCountに有効な値が入っている
' ものとする。arIntegersはEraced(未初期化)のままとする。
' それぞれの配列の先頭のIndexは0と仮定しています。

Call SafeArrayAllocDescriptor(1&, arIntegers)
Call CopyMemoryFromSafeArray(pSafeArray, arIntegers)
Call CopyMemory(ByVal pSafeArray + 2&, &H12, 2&)
Call CopyMemory(ByVal pSafeArray + 4&, 2&)
Call CopyMemory(ByVal pSafeArray + 12&, VarPtr(arBytes(0&)))
Call CopyMemory(ByVal pSafeArray + 20&, iIntegerCount)

' ここでarIntegersに対して各種処理をする。
' その間、arIntegers及びarBytesどちらに対してもReDimやEraseは
' 使わないこと。

編集 削除
キョウイチ  2008-04-17 11:45:41  No: 139541  IP: 192.*.*.*

やじゅ様、K.J.K様、回答をいただきありがとうございました。バイナリは今まであまり扱ったことがありませんでしたがやじゅ様に教えてもらったサイトの例を参考に各バイトの前後を入れ替えたりしながら試した結果何とかバイト配列のものをIntの配列に変換できました。Intを一つづつ読んだデータとバイト配列から変換したデータを比較してみましたがこのテストでは同じ数値を得ることができました。しかしK.J.K様のサンプルコードを見ると本当はかなり大変なことなのかも知れませんのでもしも基本的に何か間違ったことがあったらご指摘ください。ご指導ありがとうございました。

(VB6)
Dim ariA(42000) as Integer
Dim i as integer
Dim F 
Dim FNam as string
Dim L as Long
dim N as Long
Dim B() as byte
Dim P as integer

L = 40000
FNam="C:\MyVB\Sample.dat"

'一つずつ読み込み
F = Freefile
Open Fnam for Binary as #F
For i = 1 to L
   P = i * 2 - 1
   Get #F, P, ariA(i)
Next i
Close #F

’バイト配列で読み込み
Redim B(L * 2 + 1)
F = Freefile
Open Fnam for Binary as #F
Get #F,,B()
Close #F

For i = 1 to L 
  P = i * 2 - 1
  ariA(i) =  Val("&h" & Hex(B(P + 1)) & Hex(B(P)))
Next i

編集 削除