0

I am allocating an array that is intentionally bigger than the result of BitConverter.GetBytes. My goal is to leave the last byte empty so that I can prevent this number from being seen as the two's compliment and have tempPosBytes2[

When I run BitConverter.GetBytes my array tempPosBytes2 seems to shrink.

uint positiveNumber = 4293967296;
byte[] tempPosBytes2 = new byte[tempPosBytes.Length + 1]; // four bytes plus one
tempPosBytes2 = BitConverter.GetBytes(positiveNumber);  // tempPositiveBytes2 is now 4 bytes!!

Question

What is going on under the covers, and how can I leave the trailing byte without copying the array?

I need this to work with BigInteger(byte[]) as in the following:

BigInteger positiveBigIntBAD2 = new BigInteger(tempPosBytes2); // Invalid
4

4 に答える 4

3

配列は縮小されていません。まったく新しい配列が内部に割り当てられていBitConverter.GetBytesます。

もちろん、その出力データを選択したサイズの配列にコピーできます。

または、独自のバージョンの を作成してくださいBitConverter。それは本当に簡単です:

byte[] tempPosBytes2 = new byte[] { (byte)(positiveNumber), 
                                    (byte)(positiveNumber >> 8), 
                                    (byte)(positiveNumber >> 16), 
                                    (byte)(positiveNumber >> 24), 
                                    0 };

両方の手法を使用してパフォーマンスを比較することをお勧めします。

BigIntegerところで、.を取るコンストラクタを使用することもできますuint

于 2012-12-18T16:33:33.727 に答える
2

それは何も縮小していません。GetBytes常に新しい配列を割り当て、割り当ては既存のバイト配列への参照を上書きします。

BigInteger が負の数として解釈しないように、最上位バイトを常に 0 にする必要がある場合は、Array.Resize afterGetBytesを実行してサイズを 1 増やすと、次のように新しいバイトの値が 0 になります。あなたがしたい。

BigInteger コンストラクターページには、まさにこのことについて説明している例があり、必要な場合にのみ配列のサイズを変更する例を提供しています。まさにそれを行うヘルパーメソッドを自分で書くことができますCreateUnsignedBigInteger(byte[])

public BigInteger CreateUnsignedBigInteger(byte[] bytes)
{
    if ((bytes[bytes.Length - 1] & 0x80) > 0) 
    {
        byte[] old = bytes;
        bytes = new byte[old.Length + 1];
        Array.Copy(old, bytes, old.Length);
    }

    return new BigInteger(bytes);
}
于 2012-12-18T16:36:13.233 に答える
1

BitConverter.GetBytes配列を使用していません。渡したことがないため、使用できません。

代わりに、配列を作成してからすぐに破棄しています。

の結果をGetBytes配列に含める必要がある場合は、オーバーロードや、書き込み対象の配列を受け取る他のメソッドがあるかどうかを確認するか、コンテンツを自分でコピーします。

于 2012-12-18T16:33:46.820 に答える
1

皮肉なことbyte[]に、BigIntegerコンストラクターに渡して と同等の値を与えるuintことができる が必要な場合は、次のことができます。

byte[] tempPosBytes = new BigInteger(positiveNumber).ToByteArray();
于 2012-12-18T16:38:51.817 に答える