BYTE配列の値をShortに変換できないでしょうか?
VCでやりたいことを書くとこうなります。
BYTE by[2];
short sh;
short *pSh;
by[0] = 1;
by[1] = 0;
pSh = (short *)by;
sh = *pSh;
結果:shに1が入る
これをVBで書くにはどうすればいいんでしょうか?
dim by(2) as Byte
dim sh as Short
sh = by(2) '???
すいません。環境はVB.net2005です。
できないと思う。
素直にMAKEWORD見たいな関数を作ってください。
もしくはStructのStructLayoutとFieldOffsetを利用して共用体みたいにするとか。
参考
http://santamartadotnet.hp.infoseek.co.jp/documents/csharp/structandunion.html
それもいやならば、Win32APIのRltMemoryあたりでコピーするとか。
◎MemoryStreamとBinaryStreamを使った例です。
Dim by(1) As Byte
Dim sh As Short
Dim ms As New System.IO.MemoryStream()
Dim br As New System.IO.BinaryReader(ms)
by(0) = 1
by(1) = 0
ms.Write(by, 0, 2)
ms.Seek(0, IO.SeekOrigin.Begin)
sh = br.ReadInt16()
br.Close()
ms.Close()
>dim by(2) as Byte
VBではこの宣言の仕方だと、by(0),by(1),by(2)と3要素になりますので気をつけてくだ
さい。
訂正)
>Win32APIのRltMemory
RtlMoveMemory でした。
というか、そんなAPIよばなくてもMarshal.~でいけそうな気がしてきた。
Dim by(1) As Byte
Dim sh As Short
by(0) = 1
by(1) = 0
Dim p As System.IntPtr = Marshal.AllocHGlobal(2)
Marshal.WriteByte(p, 0, by(0))
Marshal.WriteByte(p, 1, by(1))
sh = Marshal.ReadInt16(p, 0)
Marshal.FreeHGlobal(p)
で、いろいろ調べていたらドンピシャのやつがありました。
sh = System.BitConverter.ToInt16(by, 0)
まぁ使わないと思うけど、
>Marshal.WriteByte(p, 0, by(0))
>Marshal.WriteByte(p, 1, by(1))
はMarshal.Copyを使うほうがよかったです。
>sh = System.BitConverter.ToInt16(by, 0)
これで望むことが出来ました
他にもいろいろ勉強になりました。
ありがとうございました。