UTF32Encoding.GetString(Byte[], Int32, Int32) Metoda

Definice

Dekóduje rozsah bajtů z bajtového pole do řetězce.

public:
 override System::String ^ GetString(cli::array <System::Byte> ^ bytes, int index, int count);
public override string GetString (byte[] bytes, int index, int count);
override this.GetString : byte[] * int * int -> string
Public Overrides Function GetString (bytes As Byte(), index As Integer, count As Integer) As String

Parametry

bytes
Byte[]

Bajtové pole obsahující posloupnost bajtů k dekódování.

index
Int32

Index prvního bajtu pro dekódování.

count
Int32

Počet bajtů k dekódování.

Návraty

String

Řetězec, který obsahuje výsledky dekódování zadané sekvence bajtů.

Výjimky

bytes je null.

index nebo count je menší než nula.

-nebo- index a count neoznamujte platnou oblast v bytes.

Detekce chyb je povolená a bytes obsahuje neplatnou posloupnost bajtů.

Došlo k náhradnímu obnovení (další informace najdete v tématu Kódování znaků v .NET , kde najdete úplné vysvětlení).

-a- DecoderFallback je nastavena na DecoderExceptionFallbackhodnotu .

Příklady

Následující příklad kóduje řetězec do dvou polí bajtů, jednoho v malém endian pořadí a druhý v big-endian pořadí. Pak dekóduje bajty zpět do řetězce.

using System;
using System.Text;

public class Example  
{
   public static void Main()  
   {
      // Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      UTF32Encoding u32LE = new UTF32Encoding(false, true, true);
      UTF32Encoding u32BE = new UTF32Encoding(true, true, true);

      // Create byte arrays from the same string containing the following characters:
      //    Latin Small Letter Z (U+007A)
      //    Latin Small Letter A (U+0061)
      //    Combining Breve (U+0306)
      //    Latin Small Letter AE With Acute (U+01FD)
      //    Greek Small Letter Beta (U+03B2)
      String str = "za\u0306\u01FD\u03B2";

      // barrBE uses the big-endian byte order.
      byte[] barrBE = new byte[u32BE.GetByteCount(str)];
      u32BE.GetBytes(str, 0, str.Length, barrBE, 0);

      // barrLE uses the little-endian byte order.
      byte[] barrLE = new byte[u32LE.GetByteCount(str)];
      u32LE.GetBytes(str, 0, str.Length, barrLE, 0);

      // Decode the byte arrays.
      Console.WriteLine("BE array with BE encoding:");
      DisplayString(barrBE, u32BE);
      Console.WriteLine();

      Console.WriteLine("LE array with LE encoding:");
      DisplayString(barrLE, u32LE);
      Console.WriteLine();
   
      // Decode the byte arrays using an encoding with a different byte order.
      Console.WriteLine("BE array with LE encoding:");
      try  {
         DisplayString(barrBE, u32LE);
      }
      catch (System.ArgumentException e)  {
         Console.WriteLine(e.Message);
      }
      Console.WriteLine();

      Console.WriteLine("LE array with BE encoding:");
      try  {
         DisplayString(barrLE, u32BE);
      }
      catch (ArgumentException e)  {
         Console.WriteLine(e.Message);
      }
      Console.WriteLine();
   }

   public static void DisplayString(byte[] bytes, Encoding enc)  
   {
      // Display the name of the encoding used.
      Console.Write("{0,-25}: ", enc.ToString());

      // Decode the bytes and display the characters.
      Console.WriteLine(enc.GetString(bytes, 0, bytes.Length));
   }
}
// This example displays the following output:
//   BE array with BE encoding:
//   System.Text.UTF32Encoding: zăǽβ
//
//   LE array with LE encoding:
//   System.Text.UTF32Encoding: zăǽβ
//
//   BE array with LE encoding:
//   System.Text.UTF32Encoding: Unable to translate bytes [00][00][00][7A] at index 0 from specified code page to Unicode.
//
//   LE array with BE encoding:
//   System.Text.UTF32Encoding: Unable to translate bytes [7A][00][00][00] at index 0 from specified code page to Unicode.
Imports System.Text

Public Module Example  
   Public Sub Main()  
      ' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
      Dim u32LE As New UTF32Encoding(False, True, True)
      Dim u32BE As New UTF32Encoding(True, True, True)

      ' Create byte arrays from the same string containing the following characters:
      '    Latin Small Letter Z (U+007A)
      '    Latin Small Letter A (U+0061)
      '    Combining Breve (U+0306)
      '    Latin Small Letter AE With Acute (U+01FD)
      '    Greek Small Letter Beta (U+03B2)
      Dim str As String = "za" + ChrW(&h0306) + ChrW(&h01FD) + ChrW(&h03B2)

      ' barrBE uses the big-endian byte order.
      Dim barrBE(u32BE.GetByteCount(str) - 1) As Byte
      u32BE.GetBytes(str, 0, str.Length, barrBE, 0)

      ' barrLE uses the little-endian byte order.
      Dim barrLE(u32LE.GetByteCount(str) - 1) As Byte
      u32LE.GetBytes(str, 0, str.Length, barrLE, 0)

      ' Decode the byte arrays.
      Console.WriteLine("BE array with BE encoding:")
      DisplayString(barrBE, u32BE)
      Console.WriteLine()

      Console.WriteLine("LE array with LE encoding:")
      DisplayString(barrLE, u32LE)
      Console.WriteLine()
   
      ' Decode the byte arrays using an encoding with a different byte order.
      Console.WriteLine("BE array with LE encoding:")
      Try  
         DisplayString(barrBE, u32LE)
      Catch e As ArgumentException
         Console.WriteLine(e.Message)
      End Try
      Console.WriteLine()

      Console.WriteLine("LE array with BE encoding:")
      Try  
         DisplayString(barrLE, u32BE)
      Catch e As ArgumentException
         Console.WriteLine(e.Message)
      End Try
      Console.WriteLine()
   End Sub

   Public Sub DisplayString(bytes As Byte(), enc As Encoding )  
      ' Display the name of the encoding used.
      Console.Write("{0,-25}: ", enc.ToString())

      ' Decode the bytes and display the characters.
      Console.WriteLine(enc.GetString(bytes, 0, bytes.Length))
   End Sub
End Module
' This example displays the following output:
'   BE array with BE encoding:
'   System.Text.UTF32Encoding: zăǽβ
'
'   LE array with LE encoding:
'   System.Text.UTF32Encoding: zăǽβ
'
'   BE array with LE encoding:
'   System.Text.UTF32Encoding: Unable to translate bytes [00][00][00][7A] at index 0 from specified code page to Unicode.
'
'   LE array with BE encoding:
'   System.Text.UTF32Encoding: Unable to translate bytes [7A][00][00][00] at index 0 from specified code page to Unicode.

Následující příklad inicializuje pole voláním GetByteCount metody přesně, kolik bajtů je vyžadováno pro kódovaný řetězec a pak přidá velikost bajtů order mark (BOM). Příklad pak volá metodu GetPreamble pro uložení kusovníku do pole před voláním GetBytes metody pro uložení zakódovaných bajtů do pole. Příklad pak volá metodu GetString dekódování řetězce.

using System;
using System.Text;

public class Example
{
   public static void Main()
   {
      var utf32 = new UTF32Encoding(! BitConverter.IsLittleEndian, true);

      String s = "It was the best of times, it was the worst of times...";

      // We need to dimension the array, since we'll populate it with 2 method calls.
      Byte[] bytes = new Byte[utf32.GetByteCount(s) + utf32.GetPreamble().Length];
      // Encode the string.
      Array.Copy(utf32.GetPreamble(), bytes, utf32.GetPreamble().Length);
      utf32.GetBytes(s, 0, s.Length, bytes, utf32.GetPreamble().Length);

      // Decode the byte array.
      String s2 = utf32.GetString(bytes, 0, bytes.Length);
      Console.WriteLine(s2);
   }
}
// The example displays the following output:
//        ?It was the best of times, it was the worst of times...
Imports System.Text

Module Example
   Public Sub Main()
      Dim utf32 As New UTF32Encoding(Not BitConverter.IsLittleEndian, True)

      Dim s As String = "It was the best of times, it was the worst of times..."

      ' We need to dimension the array, since we'll populate it with 2 method calls.
      Dim bytes(utf32.GetByteCount(s) + utf32.GetPreamble().Length - 1) As Byte
      ' Encode the string.
      Array.Copy(utf32.GetPreamble(), bytes, utf32.GetPreamble().Length)
      utf32.GetBytes(s, 0, s.Length, bytes, utf32.GetPreamble().Length)

      ' Decode the byte array.
      Dim s2 As String = utf32.GetString(bytes, 0, bytes.Length)
      Console.WriteLine(s2)
   End Sub
End Module
' The example displays the following output:
'       ?It was the best of times, it was the worst of times...

Všimněte si, že v tomto případě se dekódovaný řetězec liší od původního řetězce, protože začíná 32bitovou bajtů značkou pořadí U+FFFE U+0000. To znamená, že dva řetězce budou porovnávat jako nerovné a že pokud je řetězec výstupem, zobrazí se bom jako náhradní znak "?".

Poznámky

Při detekci chyb způsobí neplatná sekvence tuto metodu ArgumentExceptionvyvolá . Bez detekce chyb jsou neplatné sekvence ignorovány a vyvolá se žádná výjimka.

Pokud rozsah bajtů, které se mají dekódovat, zahrnuje bajtů order mark (BOM) a bajtové pole bylo vráceno metodou typu bez boM, je znak U+FFFE zahrnut do pole znaků vrácených touto metodou. Můžete ho String.TrimStart odebrat voláním metody.

Data, která se mají převést, například data načtená ze streamu, můžou být dostupná jenom v sekvenčních blocích. V tomto případě nebo pokud je množství dat tak velké, že je potřeba je rozdělit do menších bloků, aplikace by měla použít Decoder metodu nebo metodu nebo Encoder GetDecoder metodu GetEncoder .

Platí pro

Viz také