バイト配列に数値の2の補数表現があり、それを拡張してより大きなバイト配列を使用したいと思います。byte[]
(sから2の補数を得ることができますBigInteger
)
したがって、私の新しいバイト配列は同じ符号ビット(つまり最上位ビット)を持っている必要があり、それから他のすべてがシフトされます。
それで:
byte[] resize (byte[] raw, int len)
{
byte high = raw[0];
resized[0] = high & 0x80 //ie binary 1000 0000
raw[0] = high & 0x7F // 0111 1111
//causes a side effect but i don't care raw is a throw away value
byte[] resized = new byte[len];
system.ArrayCopy(raw,0,resized,len-raw.length, len);
}
私は正しい方向に進んでいますか?頭を動かすのに問題があります。バイト長の16進リテラルが機能します。または、16進リテラルのサイズをintサイズにする必要がありますか?もしそうなら、私は自分のすべてをキャストする必要があります。
そうです:
resized[0] = (byte) ((int)high & 0x8000)
raw[0] = (byte)((int)high & 0x7FFF)
同等ですか?