ポインタのようなことは可能? – プログラミング – Home

ポインタのようなことは可能?
 
通知
すべてクリア

[解決済] ポインタのようなことは可能?


ひろしか
 ひろしか
(@ひろしか)
ゲスト
結合: 18年前
投稿: 6
Topic starter  

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) '???


引用未解決
トピックタグ
ひろしか
 ひろしか
(@ひろしか)
ゲスト
結合: 18年前
投稿: 6
Topic starter  

すいません。環境はVB.net2005です。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

できないと思う。
素直にMAKEWORD見たいな関数を作ってください。

もしくはStructのStructLayoutとFieldOffsetを利用して共用体みたいにするとか。
参考
http://santamartadotnet.hp.infoseek.co.jp/documents/csharp/structandunion.html

それもいやならば、Win32APIのRltMemoryあたりでコピーするとか。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

◎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要素になりますので気をつけてくだ
さい。


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

訂正)
>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)


返信引用
Blue
 Blue
(@Blue)
ゲスト
結合: 20年前
投稿: 1467
 

まぁ使わないと思うけど、
>Marshal.WriteByte(p, 0, by(0))
>Marshal.WriteByte(p, 1, by(1))
はMarshal.Copyを使うほうがよかったです。


返信引用
ひろしか
 ひろしか
(@ひろしか)
ゲスト
結合: 18年前
投稿: 6
Topic starter  

>sh = System.BitConverter.ToInt16(by, 0)
これで望むことが出来ました

他にもいろいろ勉強になりました。
ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました