1

BigIntegerクラスには、バイト配列を返すメソッドがあります。これは、クラスが数値を格納するために内部的にもバイト配列を使用しているという事実を示していますか?

これは、バイナリデータを操作するための適切なデータ型を選択するために知っておくことが重要です。たとえば、クラスがInt64配列を使用する場合、関数を呼び出すことによって生データを操作するには、同様の配列の方が効率的です。

例として、特定のバイナリパターンを探してバイトをトラバースするためにToByteArrayメソッドを呼び出しています。

4

1 に答える 1

5

参照元によるとuint[]、データの情報と記号のintとして情報を格納しているようです。

namespace System.Numerics
{
    /// <summary>Represents an arbitrarily large signed integer.</summary>
    [Serializable]
    public struct BigInteger : IFormattable, IComparable, IComparable<BigInteger>, IEquatable<BigInteger>
    {

    // For values int.MinValue < n <= int.MaxValue, the value is stored in sign
    // and _bits is null. For all other values, sign is +1 or -1 and the bits are in _bits
    internal int _sign;
    internal uint[] _bits;

実行するために実行するコードは次のとおりですToByteArray()

    // Return the value of this BigInteger as a little-endian twos-complement
    // byte array, using the fewest number of bytes possible. If the value is zero,
    // return an array of one byte whose element is 0x00.
    public byte[] ToByteArray() {
        if (_bits == null && _sign == 0)
            return new byte[] { 0 };

        // We could probably make this more efficient by eliminating one of the passes.
        // The current code does one pass for uint array -> byte array conversion,
        // and then another pass to remove unneeded bytes at the top of the array.
        uint[] dwords;
        byte highByte;

        if (_bits == null) {
            dwords = new uint[] { (uint)_sign };
            highByte = (byte)((_sign < 0) ? 0xff : 0x00);
        }
        else if(_sign == -1) {
            dwords = (uint[])_bits.Clone();
            NumericsHelpers.DangerousMakeTwosComplement(dwords);  // mutates dwords
            highByte = 0xff;
        } else {
            dwords = _bits;
            highByte = 0x00;
        }

        byte[] bytes = new byte[checked(4 * dwords.Length)];
        int curByte = 0;
        uint dword;
        for (int i = 0; i < dwords.Length; i++) {
            dword = dwords[i];
            for (int j = 0; j < 4; j++) {
                bytes[curByte++] = (byte)(dword & 0xff);
                dword >>= 8;
            }
        }

        // find highest significant byte
        int msb;
        for (msb = bytes.Length - 1; msb > 0; msb--) {
            if (bytes[msb] != highByte) break;
        }
        // ensure high bit is 0 if positive, 1 if negative
        bool needExtraByte = (bytes[msb] & 0x80) != (highByte & 0x80);

        byte[] trimmedBytes = new byte[msb + 1 + (needExtraByte ? 1 : 0)];
        Array.Copy(bytes, trimmedBytes, msb + 1);

        if (needExtraByte) trimmedBytes[trimmedBytes.Length - 1] = highByte;
        return trimmedBytes;
    }
于 2012-08-05T19:48:57.583 に答える