バイト配列をキャストしてInteger型配列として使うには?


杏仁豆腐  2005-07-01 06:37:44  No: 123168

はじめまして。
VB6を使ってソフトを作らなければならなくなりました。
C言語はちょっとばかりやっているので分かるのですが
VBは素人でちょっとした処理でも考え込んでしまう始末です。

質問ですが下記のように配列の型をキャストして使用したいのですが
VBではどのように行うのが良いのでしょうか?

char data[100];
short *idata;

idata = (short *)data;

ざっと見たところVBにはキャストという概念がないように思われます。
一旦同じバイト数分のInteger型の配列を用意し、CopyMemory等で
バイト配列からメモリ内容をコピーしなければ使えないのでしょうか?
それとも、もっと単純なことなんでしょうか?

よろしくお願いします。


ガッ  2005-07-01 17:29:11  No: 123169

> ざっと見たところVBにはキャストという概念がないように思われます。
> 一旦同じバイト数分のInteger型の配列を用意し、CopyMemory等で
> バイト配列からメモリ内容をコピーしなければ使えないのでしょうか?
私の知っている限りでは、この通りです(orz

※最悪、その部分だけCでDLLを作って呼び出す、
  という事もできますので別に気にしてはいませんけどね(ぇ


K.J.K.  2005-07-01 18:22:14  No: 123170

VBの配列はSAFEARRAY*なので、SafeArrayAllocDescriptor
などを組み合わせて使えば、キャストも可能です。


ひろ  2005-07-01 20:00:34  No: 123171

元の環境のエンディアンによって動きが違うので、
特にIntel系以外のCPUを前提とした物から移植するときは要注意ですね。

元のコードを書いた人にどういう動作を意図していたのかきちんと
確認しておくことをお勧めします。
(バグもしくは激しい環境依存の臭いがしますので)


杏仁豆腐  2005-07-02 06:27:23  No: 123172

16ビットのグレースケール画像データをあるプロトコルにて
送受信しているのですが、プロトコル部の処理は全てバイト
配列にデータを入れて処理しているのですが、画像処理をする
時にはIntegerの方が好都合となるのでキャストすれば良いか
と思っていたのですが、いざキャストする段階で「はて?」
となってしまったわけです。

処理速度がどうも遅いとなれば
>最悪、その部分だけCでDLLを作って呼び出す、
>という事もできますので別に気にしてはいませんけどね
という方法も検討したいと思います。

とりあえず、データ受信段階で画像データの受信開始時からInteger型の
配列にデータを入れるというようにすることで対処したいと思いますが
K.J.K.さんのおっしゃるSafeArrayAllocDescriptorを使うことで
キャストが出来るなら、それも検討したいと思います。

SafeArrayAllocDescriptorで配列のポインタのようなものが用意できる
のは分かるのですが、そこにバイト配列の実体を関連付ける方法が
ちょっと分かりませんでした。
よろしければ、もう少し解説願えますでしょうか?

>元の環境のエンディアンによって動きが違うので、
>特にIntel系以外のCPUを前提とした物から移植するときは要注意ですね。

その辺りは考慮しております。ご指摘ありがとうございました。


K.J.K.  2005-07-02 14:45:44  No: 123173

pcdn.visualbasicに、それを使ったサンプルコードを投稿した
記憶があります。(2001/04/02)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加