0

array^ byteArray署名されていないshortとintを作成するには、リトルエンディアンシーケンスでバイトを抽出する必要があります。私は私が考えることができる次のすべての組み合わせを試したので、助けを求めています。

int x = UInt32(byteArray[i]) + (UInt32)(0x00ff) * UInt32(byteArray[i + 1]);
int x = UInt32(byteArray[i]) + UInt32(0x00ff) * UInt32(byteArray[i + 1]);
int x = byteArray[i] + 0x00ff * byteArray[i + 1];

問題は最下位バイト(i + 1)です。0x50であることはわかっていますが、生成されたshort/intは下位バイトを0x0bとして報告します。上位バイトは影響を受けません。

これはサインエラーだと思いますが、修正できないようです。

4

5 に答える 5

3

マネージコードを使用しています。エンディアンネスは、フレームワークが認識している実装の詳細です。

array<Byte>^ arr = gcnew array<Byte> { 1, 2, 3, 4 };
int value = BitConverter::ToInt16(arr, 1);
System::Diagnostics::Debug::Assert(value == 0x302);

フレームワークの仮定が正しいかどうかは、データがどこから来たかによって異なります。

于 2011-09-24T22:54:23.740 に答える
2

2つの8ビットintから16ビットintを生成する適切な方法は次のとおりです。value = static_cast< int16_t >( hibyte ) << 8 | lobyte;

于 2011-09-24T22:45:06.433 に答える
1
int y = byteArray[i] | byteArray[i + 1] << 8;

使用する必要があるものです。(vector<unsignedchar>をvector<unsignedshort>に変換するも参照してください)

于 2011-09-24T22:45:30.747 に答える
0

代わりにこれを行いたい

int x = UInt32(byteArray[i]) | (UInt32(byteArray[i + 1]) << 8);

あなたの乗数は物事を台無しにしています。

于 2011-09-24T22:46:22.407 に答える
0

0x01002番目のバイトに。の代わりにを掛ける必要があり0x00ffます。

これは、9ではなく10を掛ける10進法のようなものです。

于 2011-09-24T22:47:04.057 に答える