BigInteger.ToByteArray 方法

定义

重载

ToByteArray()

BigInteger 值转换为字节数组。

ToByteArray(Boolean, Boolean)

使用尽可能少的字节数返回此 BigInteger 的值作为字节数组。 如果值为零,则返回一个字节(其元素为 0x00)的数组。

ToByteArray()

BigInteger 值转换为字节数组。

public:
 cli::array <System::Byte> ^ ToByteArray();
public byte[] ToByteArray ();
member this.ToByteArray : unit -> byte[]
Public Function ToByteArray () As Byte()

返回

Byte[]

转换为字节数组的当前 BigInteger 对象的值。

示例

以下示例演示了某些 BigInteger 值在字节数组中的表示方式。

using System;
using System.Numerics;

public class Example
{
   static byte[] bytes;

   public static void Main()
   {
      BigInteger[] numbers = { BigInteger.MinusOne, BigInteger.One,
                               BigInteger.Zero, 120, 128, 255, 1024,
                               Int64.MinValue, Int64.MaxValue,
                               BigInteger.Parse("90123123981293054321") };
      foreach (BigInteger number in numbers)
      {
         bytes = number.ToByteArray();
         Console.Write("{0} ({1}) -> ", number, number.ToString(GetSpecifier()));
         Console.Write("{0} bytes: ", bytes.Length);
         foreach (byte byteValue in bytes)
            Console.Write("{0:X2} ", byteValue);

         Console.WriteLine();
      }
   }

   private static string GetSpecifier()
   {
      return "X" + (bytes.Length * 2).ToString();
   }
}
// The example displays the following output:
//    -1 (FF) -> 1 bytes: FF
//    1 (01) -> 1 bytes: 01
//    0 (00) -> 1 bytes: 00
//    120 (78) -> 1 bytes: 78
//    128 (0080) -> 2 bytes: 80 00
//    255 (00FF) -> 2 bytes: FF 00
//    1024 (0400) -> 2 bytes: 00 04
//    -9223372036854775808 (8000000000000000) -> 8 bytes: 00 00 00 00 00 00 00 80
//    9223372036854775807 (7FFFFFFFFFFFFFFF) -> 8 bytes: FF FF FF FF FF FF FF 7F
//    90123123981293054321 (04E2B5A7C4A975E971) -> 9 bytes: 71 E9 75 A9 C4 A7 B5 E2 04
Imports System.Numerics

Module Example
   Dim bytes() As Byte
      
   Public Sub Main()
      Dim numbers() As BigInteger = { BigInteger.MinusOne, BigInteger.One, 
                                      BigInteger.Zero, 120, 128, 255, 1024, 
                                      Int64.MinValue, Int64.MaxValue, 
                                      BigInteger.Parse("90123123981293054321") }
      For Each number As BigInteger In numbers
         bytes = number.ToByteArray()
         Console.Write("{0} ({1}) -> ", number, number.ToString(GetSpecifier()))
         Console.Write("{0} bytes: ", bytes.Length)
         For Each byteValue As Byte In bytes
            Console.Write("{0:X2} ", byteValue)
         Next
         Console.WriteLine()
      Next   
   End Sub
   
   Private Function GetSpecifier() As String
      Return "X" + CStr(bytes.Length * 2)
   End Function
End Module
' The example displays the following output:
'    -1 (FF) -> 1 bytes: FF
'    1 (01) -> 1 bytes: 01
'    0 (00) -> 1 bytes: 00
'    120 (78) -> 1 bytes: 78
'    128 (0080) -> 2 bytes: 80 00
'    255 (00FF) -> 2 bytes: FF 00
'    1024 (0400) -> 2 bytes: 00 04
'    -9223372036854775808 (8000000000000000) -> 8 bytes: 00 00 00 00 00 00 00 80
'    9223372036854775807 (7FFFFFFFFFFFFFFF) -> 8 bytes: FF FF FF FF FF FF FF 7F
'    90123123981293054321 (04E2B5A7C4A975E971) -> 9 bytes: 71 E9 75 A9 C4 A7 B5 E2 04

注解

此方法返回的数组中的各个字节以小端顺序显示。 也就是说,值的低阶字节位于高阶字节之前。 数组的第一个字节反映值的前 8 位 BigInteger ,第二个字节反映接下来的 8 位,依此。 例如,值 1024 或 0x0400 存储为以下两个字节的数组:

元素 字节值
0 0x00
1 0x04

负值以最紧凑的形式使用二的补补表示形式写入数组。 例如,-1 表示为一个字节,其值为 0xFF ,而不是具有多个元素(如 0xFF0xFF0xFF0xFF0xFF、) 0xFF的数组。

由于两个的补补表示形式始终将数组中最后一个字节的最高阶位解释为符号位 (位置 Array.Length- 1) 字节,因此该方法返回一个字节数组,其中包含一个额外元素,其值为零以消除正值的歧义,否则这些正值可能被解释为设置其符号位。 例如,值 120 或 0x78 表示为单字节数组: 0x78。 但是,128 或 0x80表示为双字节数组: 0x800x00

可以通过将值存储到字节数组,然后使用 构造函数还原该值BigInteger(Byte[])来往返BigInteger

注意

如果代码在此方法返回的数组中修改单个字节的值,然后再还原该值,则必须确保不会无意中更改符号位。 例如,如果修改增加了一个正值,以便设置字节数组的最后一个元素中的最高位,则可以将值为零的新字节添加到数组的末尾。

适用于

ToByteArray(Boolean, Boolean)

使用尽可能少的字节数返回此 BigInteger 的值作为字节数组。 如果值为零,则返回一个字节(其元素为 0x00)的数组。

public byte[] ToByteArray (bool isUnsigned = false, bool isBigEndian = false);
member this.ToByteArray : bool * bool -> byte[]
Public Function ToByteArray (Optional isUnsigned As Boolean = false, Optional isBigEndian As Boolean = false) As Byte()

参数

isUnsigned
Boolean

如果使用无符号编码,则为 true;否则为 false

isBigEndian
Boolean

如果以大端字节顺序写入字节,则为 true;否则为 false

返回

Byte[]

转换为字节数组的当前 BigInteger 对象的值。

例外

如果 isUnsignedtrueSign 为负。

注解

整数值 33022 可以在四个不同的数组中导出:

属性 结果
isUnsigned: false, isBigEndian: false new byte[] { 0xFE, 0x80, 0x00 }
isUnsigned: false, isBigEndian: true new byte[] { 0x00, 0x80, 0xFE }
isUnsigned: true, isBigEndian: false new byte[] { 0xFE, 0x80 }
isUnsigned: true, isBigEndian: true new byte[] { 0x80, 0xFE }

适用于