Sdílet prostřednictvím


BigInteger.ToByteArray Metoda

Definice

Přetížení

ToByteArray()

BigInteger Převede hodnotu na bajtové pole.

ToByteArray(Boolean, Boolean)

Vrátí hodnotu tohoto BigInteger pole jako pole bajtů s nejmenším možným počtem bajtů. Pokud je hodnota nula, vrátí pole o jednom bajtu, jehož prvek je 0x00.

ToByteArray()

Zdroj:
BigInteger.cs
Zdroj:
BigInteger.cs
Zdroj:
BigInteger.cs

BigInteger Převede hodnotu na bajtové pole.

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

Návraty

Byte[]

Hodnota aktuálního BigInteger objektu převedeného na pole bajtů.

Příklady

Následující příklad ukazuje, jak jsou některé BigInteger hodnoty reprezentovány v bajtových polích.

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
open System
open System.Numerics

let numbers =
    [| BigInteger.MinusOne
       BigInteger.One
       BigInteger.Zero
       120
       128
       255
       1024
       Int64.MinValue
       Int64.MaxValue
       BigInteger.Parse("90123123981293054321") |]

for number in numbers do
    let bytes = number.ToByteArray()
    printf $"""{number} ({number.ToString("X" + (bytes.Length * 2).ToString())}) -> """
    printf $"{bytes.Length} bytes: "

    for byteValue in bytes do
        printf $"{byteValue:X2} "

    printfn ""

// 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

Poznámky

Jednotlivé bajty v poli vrácené touto metodou se zobrazí v pořadí little-endian. To znamená, že bajty nižšího řádu hodnoty předchází bajtům vyššího pořadí. První bajt pole odráží prvních osm bitů BigInteger hodnoty, druhý bajt dalších osm bitů atd. Například hodnota 1024 nebo 0x0400 je uložena jako následující pole se dvěma bajty:

Prvek Hodnota bajtů
0 0x00
1 0x04

Záporné hodnoty se zapisují do pole pomocí reprezentace dvojky v nejkompaktnější možné podobě. Například hodnota -1 je reprezentována jako jeden bajt, jehož hodnota je 0xFF místo pole s více prvky, jako 0xFFjsou , 0xFF nebo 0xFF, 0xFF, 0xFF, . 0xFF

Vzhledem k tomu, že reprezentace doplňku two vždy interpretuje bit nejvyššího pořadí posledního bajtu v matici (bajt na pozici Array.Length- 1) jako bit znaménka, vrátí metoda pole bajtů s dodatečným prvkem, jehož hodnota je nula, k nejednoznačnosti kladných hodnot, které by jinak mohly být interpretovány jako jejich bity znaménka nastavené. Například hodnota 120 nebo 0x78 je reprezentována jako jedno bajtové pole: 0x78. Číslo 128 nebo 0x80je však reprezentováno jako dvou bajtové pole: 0x80, 0x00.

Hodnotu můžete vrátit zpět BigInteger tak, že ji uložíte do pole bajtů a pak ji obnovíte pomocí konstruktoru BigInteger(Byte[]) .

Upozornění

Pokud váš kód změní hodnotu jednotlivých bajtů v poli vrácené touto metodou před obnovením hodnoty, musíte zajistit, aby nedošlo k neúmyslné změně bitu znaménka. Pokud například vaše úpravy zvýší kladnou hodnotu tak, že bit nejvyššího pořadí v posledním prvku pole bajtů se stane set, můžete na konec pole přidat nový bajt, jehož hodnota je nula.

Platí pro

ToByteArray(Boolean, Boolean)

Zdroj:
BigInteger.cs
Zdroj:
BigInteger.cs
Zdroj:
BigInteger.cs

Vrátí hodnotu tohoto BigInteger pole jako pole bajtů s nejmenším možným počtem bajtů. Pokud je hodnota nula, vrátí pole o jednom bajtu, jehož prvek je 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()

Parametry

isUnsigned
Boolean

truepoužívat kódování bez znaménka; v opačném případě . false

isBigEndian
Boolean

truepsát bajty v pořadí bajtů big-endian; v opačném případě . false

Návraty

Byte[]

Hodnota aktuálního BigInteger objektu převedeného na pole bajtů.

Výjimky

Pokud isUnsigned je true a Sign je negativní.

Poznámky

Celočíselná hodnota 33022 se dá exportovat do čtyř různých polí:

Vlastnosti Výsledek
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 }

Platí pro