アプリ版:「スタンプのみでお礼する」機能のリリースについて

TCPの通信アプリケーションをて作成しています。

Recvbuff(1024) as byte
と定義した変数に受信したデータを格納し以下のような構造体に格納
したいのです。

構造体A
id as integer
Usercode as string
Username as string
Filename as string

このとき、共用体のような使いかたはVBではできないようなので
すが、このような場合
整数なら「Recvbuff(1) * 256 + Recvbuff(0)」のように計算する。 
文字列なら必要な文字のみ切り取ってGetStringで変換する。
といった方法しかないのでしょうか。

環境は
VS2008
VB.NET
です。

A 回答 (2件)

自分がうまく質問内容を取れているかわからんのだが,



>>このとき、共用体のような使いかたはVB.NETで
>出来る方法はないのか?

と解釈してみる。それでよければ…

検索してこんな記事を見つけるけど,あってるのか不安だ。
Use Interop Code and Overlap Fields with the Union Construct in VB.NET
http://www.developer.com/net/vb/article.php/3602 …
    • good
    • 0
この回答へのお礼

StructLayout属性というものを使う方法でしょうか。
確かにこのキーワードで検索すると同じような悩みを
持っている。というかVB.NETでも共用体のような使い方
をすることができるということですね。
ありがとうございました。

お礼日時:2009/06/06 23:34

バッファ内に文字列がどんな状態で格納されているかにもよりますね。


固定長であれば、Marshalの力を借りればいけそうな気がします。
TCP通信とのことなので、可変長(NullCharで区切り)っぽいような・・・。これだとかなり厄介なことになりそう・・・。

面倒でも配列を読みながら切り分けしたほうがよいとは思います。
あえて茨の道を進むというのであれば下記はスルーで。


バイト配列から固定長の変数型を取り出すのはBitConverterで簡単にできます。

私なら、BinaryReaderを継承してReadStringを改造しますね。MemoryStreamに放り込んだ配列を先頭から順番にRead***していきます。
クラスとして作っておけば他にも流用できるので。
(というか実際にTCP通信のPG組むときにこの方法でやりました。)

参考意見として。
    • good
    • 0
この回答へのお礼

まさに御想像のとおり可変長のNullで区切りのデータをMarshalでなんとかしようと思いはまってしまいました。
配列を読みながら区切りわけするようにしました。

BinaryReaderを継承してReadStringを改造する方法にもトライしたい
と思います。

お礼日時:2009/06/06 23:24

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