-2

質問が少し奇妙であることは知っています。関連する情報が見つからなかったので、純粋な好奇心から尋ねています。また、お気軽にタイトルを編集してください。ひどいことは承知していますが、これ以上改善することはできませんでした。

short または ushort の object 型の変数 foo があるとします。ネットワーク経由で送信する必要があるため、BitConverter を使用してバイト [] に変換します。

byte[] b = new byte[2];
if(foo is short){
    BitConverter.GetBytes((short)foo, 0);
}else{
    BitConverter.GetBytes((ushort)foo, 0);
}

ネットワーク/ソケット マジックが発生しました。変数を元に戻したいです。取得する予定の型がわかっているので、BitConverter.GetUInt16 または GetInt16 を適切に呼び出します。

さて、問題は、変数をどのようにシリアル化したかが実際に問題になるかどうかです。つまり、ビットは同じなので意味がないはずですよね?できるように

BitConverter.GetBytes((short)foo, 0);

そして、する

BitConverter.GetUInt16(myByteArray, 0);

誰?

4

2 に答える 2

0

ネットワーク経由で送信している場合、エンディアンの問題が発生する可能性があります (つまり、マルチバイト値は、異なるアーキテクチャでは異なるバイト順で格納される可能性があります)。マルチバイト値をネットワーク経由で送信するときの標準的な規則は、それをNetwork Byte Orderに変換することです。

マルチバイト値の受信者は、それをHost Byte Orderに変換します。

于 2014-09-01T15:41:50.017 に答える
0

変数をシリアル化するには、BitConverter.GetBytes() の結果を byte[] に割り当てる必要があります。変数が short であるか ushort であるかは問題ではありません。それらは同じサイズであり、0 から 32767 までの同じ値を保持するためです。サイズが問題ない限り、問題はないはずです。

したがって、コードを次のように単純にすることができます。

byte[] b;
if(foo is short || foo is ushort)
    b = BitConverter.GetBytes((short)foo); // You get proper results for ushort as well

ただし、デコードサイトでは、必要なタイプを知っておく必要があります。要するに、必要なものは次のとおりです。

short foo = BitConverter.ToInt16(b, 0);

ただし、ushort が必要な場合は、次のように記述します。

ushort foo = BitConverter.ToUInt16(b, 0);

マルチバイト変数をネットワーク経由で送信する場合は、@itsme86 が彼の回答で述べたように、変数がネットワーク バイト順であることも確認する必要があります。

short と ushort の両方を送信する必要がある場合は、データ型が署名されているかどうかを知るために、型情報も送信する必要があります。コードが複雑になるので、今は詳しく書きません。

于 2014-09-01T15:58:51.927 に答える