1

だから基本的にここに私が持っているものがあります。ユーザーは整数を与え、それを 3 バイトに変換しています。

int number = 167123;

byte[0] = (int)number / 65536;
byte[1] = (int)number / 256;
byte[2] = (int)number;

stream.Position = 0x503;   
stream.WriteByte((byte)byte[2]);
stream.WriteByte((byte)byte[1]);
stream.WriteByte((byte)byte[0]);

(注: 最後に、意図的にバイト配列を逆方向に循環しています。)

後で値を確認すると、意図したとおりに機能します。今、私はコードをよく見て、手で計算しようとしていますが、正しい答えが得られません。私は何を間違っていますか?これはどのように機能していますか?Visual C# が 167123 を「バイト」としてキャストするとき、3 番目のバイトに書き込むのは何ですか?

4

2 に答える 2

2

これが機能する理由はint、バイトへの値の割り当てによって値が切り捨てられるためです。これがあなたの数学がうまくいかない理由かもしれません - あなたは切り捨てていません.

基本的に、除算によって行っていることはビットシフトです。あなたのコードはこれと同じです:

byte[0] = (int)number >> 16;
byte[1] = (int)number >> 8;
byte[2] = (int)number;

手計算を機能させるには、計算を行ってから 2 進数に変換し、最後の 8 桁を超えるものを切り捨てます。これは、バイト配列に割り当てる番号です。

一例:

byte[1] = (int)number / 256;

これは 167123 / 256 = 652 です。バイナリでは、これは 001010001100 です。ここで、1 バイト (8 ビット) のサイズを超えるものをすべて切り捨てると、10001100 になり、10 進数では 140 になります。これは、このバイト配列インデックスに割り当てられるものです。

于 2013-04-28T23:20:50.013 に答える
1

代わりに、このメソッドを使用してみてください: BitConvet.GetBytes(int)この問題についての詳細は、この質問でも入手できます。

于 2013-04-28T23:17:54.467 に答える