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

Definizione

Decodifica un intervallo di byte da una matrice di byte in una stringa.

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

Parametri

bytes
Byte[]

Matrice di byte contenente la sequenza di byte da decodificare.

index
Int32

Indice del primo byte da decodificare.

count
Int32

Numero di byte da decodificare.

Restituisce

Stringa contenente i risultati di decodifica della sequenza di byte specificata.

Eccezioni

bytes è null.

index o count è minore di zero.

-oppure-

index e count non indicano un intervallo valido in bytes.

Il rilevamento degli errori è abilitato, e bytes contiene una sequenza di byte non valida.

Si è verificato un fallback (per altre informazioni, vedere Codifica dei caratteri in .NET per una spiegazione completa).

-e-

DecoderFallback è impostato su DecoderExceptionFallback.

Esempio

Nell'esempio seguente viene codificata una stringa in due matrici di byte, una in ordine little-endian e l'altra in ordine big-endian. Decodifica quindi i byte in una stringa.

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.

Nell'esempio seguente viene inizializzata una matrice chiamando il metodo per determinare esattamente il GetByteCount numero di byte necessari per una stringa codificata e quindi aggiungendo le dimensioni del contrassegno dell'ordine di byte (BOM). L'esempio chiama quindi il GetPreamble metodo per archiviare la boma nella matrice prima di chiamare il GetBytes metodo per archiviare i byte codificati nella matrice. L'esempio chiama quindi il GetString metodo per decodificare la stringa.

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

Si noti che in questo caso la stringa decodificata differisce dalla stringa originale, poiché inizia con un ordine di byte a 32 bit U+FFFE U+0000. Ciò significa che le due stringhe verranno confrontate come non uguali e che se la stringa è di output, la bom verrà visualizzata come carattere di sostituzione "?".

Commenti

Con il rilevamento degli errori, una sequenza non valida causa la creazione di un metodo ArgumentException. Senza rilevamento errori, le sequenze non valide vengono ignorate e non viene generata alcuna eccezione.

Se l'intervallo di byte da decodificare include il contrassegno dell'ordine di byte (BOM) e la matrice di byte è stata restituita da un metodo di tipo non compatibile con BOM, il carattere U+FFFE è incluso nella matrice di caratteri restituita da questo metodo. È possibile rimuoverlo chiamando il String.TrimStart metodo .

I dati da convertire, ad esempio i dati letti da un flusso, potrebbero essere disponibili solo in blocchi sequenziali. In questo caso, o se la quantità di dati è così grande che deve essere suddivisa in blocchi più piccoli, l'applicazione deve usare DecoderEncoder rispettivamente o il GetDecoder metodo fornito dal metodo o dal GetEncoder metodo.

Si applica a

Vedi anche