Encoding.GetChars Método
Definição
Importante
Algumas informações dizem respeito a um produto pré-lançado que pode ser substancialmente modificado antes de ser lançado. A Microsoft não faz garantias, de forma expressa ou implícita, em relação à informação aqui apresentada.
Quando é sobreposto numa classe derivada, decodifica uma sequência de bytes num conjunto de caracteres.
Sobrecargas
| Name | Description |
|---|---|
| GetChars(Byte[], Int32, Int32, Char[], Int32) |
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado para o array de caracteres especificado. |
| GetChars(Byte*, Int32, Char*, Int32) |
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes a partir do ponteiro de byte especificado para um conjunto de caracteres que são armazenados a partir do ponteiro especificado. |
| GetChars(ReadOnlySpan<Byte>, Span<Char>) |
Quando sobrescrito numa classe derivada, decodifica todos os bytes do intervalo de bytes especificado para apenas leitura num espaço de caracteres. |
| GetChars(Byte[]) |
Quando sobrescrito numa classe derivada, descodifica todos os bytes do array de bytes especificado num conjunto de caracteres. |
| GetChars(Byte[], Int32, Int32) |
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado num conjunto de caracteres. |
GetChars(Byte[], Int32, Int32, Char[], Int32)
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado para o array de caracteres especificado.
public:
abstract int GetChars(cli::array <System::Byte> ^ bytes, int byteIndex, int byteCount, cli::array <char> ^ chars, int charIndex);
public abstract int GetChars(byte[] bytes, int byteIndex, int byteCount, char[] chars, int charIndex);
abstract member GetChars : byte[] * int * int * char[] * int -> int
Public MustOverride Function GetChars (bytes As Byte(), byteIndex As Integer, byteCount As Integer, chars As Char(), charIndex As Integer) As Integer
Parâmetros
- bytes
- Byte[]
O array de bytes que contém a sequência de bytes a decodificar.
- byteIndex
- Int32
O índice do primeiro byte a descodificar.
- byteCount
- Int32
O número de bytes a descodificar.
- chars
- Char[]
O array de caracteres para conter o conjunto resultante de caracteres.
- charIndex
- Int32
O índice a partir do qual começar a escrever o conjunto resultante de caracteres.
Devoluções
O número real de caracteres escritos em chars.
Exceções
byteIndex ou byteCount ou charIndex é menor que zero.
-ou-
byteIndex e byteCount não denotam um intervalo válido em bytes.
-ou-
charIndex não é um índice válido em chars.
chars não tem capacidade suficiente de charIndex até ao fim do array para acomodar os caracteres resultantes.
Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)
- e -
DecoderFallback está definido como DecoderExceptionFallback.
Exemplos
O exemplo seguinte converte uma cadeia de uma codificação para outra.
using System;
using System.Text;
class Example
{
static void Main()
{
string unicodeString = "This string contains the unicode character Pi (\u03a0)";
// Create two different encodings.
Encoding ascii = Encoding.ASCII;
Encoding unicode = Encoding.Unicode;
// Convert the string into a byte array.
byte[] unicodeBytes = unicode.GetBytes(unicodeString);
// Perform the conversion from one encoding to the other.
byte[] asciiBytes = Encoding.Convert(unicode, ascii, unicodeBytes);
// Convert the new byte[] into a char[] and then into a string.
char[] asciiChars = new char[ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)];
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0);
string asciiString = new string(asciiChars);
// Display the strings created before and after the conversion.
Console.WriteLine("Original string: {0}", unicodeString);
Console.WriteLine("Ascii converted string: {0}", asciiString);
}
}
// The example displays the following output:
// Original string: This string contains the unicode character Pi (Π)
// Ascii converted string: This string contains the unicode character Pi (?)
Imports System.Text
Class Example
Shared Sub Main()
Dim unicodeString As String = "This string contains the unicode character Pi (" & ChrW(&H03A0) & ")"
' Create two different encodings.
Dim ascii As Encoding = Encoding.ASCII
Dim unicode As Encoding = Encoding.Unicode
' Convert the string into a byte array.
Dim unicodeBytes As Byte() = unicode.GetBytes(unicodeString)
' Perform the conversion from one encoding to the other.
Dim asciiBytes As Byte() = Encoding.Convert(unicode, ascii, unicodeBytes)
' Convert the new byte array into a char array and then into a string.
Dim asciiChars(ascii.GetCharCount(asciiBytes, 0, asciiBytes.Length)-1) As Char
ascii.GetChars(asciiBytes, 0, asciiBytes.Length, asciiChars, 0)
Dim asciiString As New String(asciiChars)
' Display the strings created before and after the conversion.
Console.WriteLine("Original string: {0}", unicodeString)
Console.WriteLine("Ascii converted string: {0}", asciiString)
End Sub
End Class
' The example displays the following output:
' Original string: This string contains the unicode character Pi (Π)
' Ascii converted string: This string contains the unicode character Pi (?)
O exemplo seguinte codifica uma cadeia num array de bytes, e depois descodifica um intervalo desses bytes num array de caracteres.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Encoding u32LE = Encoding.GetEncoding( "utf-32" );
Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );
// Use a 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 myStr = "za\u0306\u01FD\u03B2";
// Encode the string using the big-endian byte order.
byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );
// Encode the string using the little-endian byte order.
byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );
// Get the char counts, decode eight bytes starting at index 0,
// and print out the counts and the resulting bytes.
Console.Write( "BE array with BE encoding : " );
PrintCountsAndChars( barrBE, 0, 8, u32BE );
Console.Write( "LE array with LE encoding : " );
PrintCountsAndChars( barrLE, 0, 8, u32LE );
}
public static void PrintCountsAndChars( byte[] bytes, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-25} :", enc.ToString() );
// Display the exact character count.
int iCC = enc.GetCharCount( bytes, index, count );
Console.Write( " {0,-3}", iCC );
// Display the maximum character count.
int iMCC = enc.GetMaxCharCount( count );
Console.Write( " {0,-3} :", iMCC );
// Decode the bytes and display the characters.
char[] chars = enc.GetChars( bytes, index, count );
// The following is an alternative way to decode the bytes:
// char[] chars = new char[iCC];
// enc.GetChars( bytes, index, count, chars, 0 );
Console.WriteLine( chars );
}
}
/*
This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
BE array with BE encoding : System.Text.UTF32Encoding : 2 6 :za
LE array with LE encoding : System.Text.UTF32Encoding : 2 6 :za
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
Dim u32BE As Encoding = Encoding.GetEncoding("utf-32BE")
' Use a 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 myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)
' Encode the string using the big-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates barrBE with the exact number of elements required.
Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)
' Encode the string using the little-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates barrLE with the exact number of elements required.
Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
u32LE.GetBytes(myStr, 0, myStr.Length, barrLE, 0)
' Get the char counts, decode eight bytes starting at index 0,
' and print out the counts and the resulting bytes.
Console.Write("BE array with BE encoding : ")
PrintCountsAndChars(barrBE, 0, 8, u32BE)
Console.Write("LE array with LE encoding : ")
PrintCountsAndChars(barrLE, 0, 8, u32LE)
End Sub
Public Shared Sub PrintCountsAndChars(bytes() As Byte, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-25} :", enc.ToString())
' Display the exact character count.
Dim iCC As Integer = enc.GetCharCount(bytes, index, count)
Console.Write(" {0,-3}", iCC)
' Display the maximum character count.
Dim iMCC As Integer = enc.GetMaxCharCount(count)
Console.Write(" {0,-3} :", iMCC)
' Decode the bytes.
Dim chars As Char() = enc.GetChars(bytes, index, count)
' The following is an alternative way to decode the bytes:
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
' Dim chars(iCC - 1) As Char
' enc.GetChars( bytes, index, count, chars, 0 )
' Display the characters.
Console.WriteLine(chars)
End Sub
End Class
'This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
'
'BE array with BE encoding : System.Text.UTF32Encoding : 2 6 :za
'LE array with LE encoding : System.Text.UTF32Encoding : 2 6 :za
Observações
Para calcular o tamanho exato do array necessário GetChars para armazenar os caracteres resultantes, deve usar o GetCharCount método. Para calcular o tamanho máximo do array, use o GetMaxCharCount método. O GetCharCount método geralmente permite a alocação de menos memória, enquanto o GetMaxCharCount método geralmente é executado mais rapidamente.
GetChars(Byte[], Int32, Int32, Char[], Int32) obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.
Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.
Note
Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.
O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.
Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:
A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)
Se a sua aplicação gerir as saídas de strings, o GetString método é recomendado. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.
A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.
Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.
Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.
Ver também
Aplica-se a
GetChars(Byte*, Int32, Char*, Int32)
Importante
Esta API não está em conformidade com CLS.
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes a partir do ponteiro de byte especificado para um conjunto de caracteres que são armazenados a partir do ponteiro especificado.
public:
virtual int GetChars(System::Byte* bytes, int byteCount, char* chars, int charCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetChars(byte* bytes, int byteCount, char* chars, int charCount);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetChars(byte* bytes, int byteCount, char* chars, int charCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetChars(byte* bytes, int byteCount, char* chars, int charCount);
[System.CLSCompliant(false)]
public virtual int GetChars(byte* bytes, int byteCount, char* chars, int charCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
abstract member GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
override this.GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
override this.GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
override this.GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
[<System.CLSCompliant(false)>]
abstract member GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
override this.GetChars : nativeptr<byte> * int * nativeptr<char> * int -> int
Parâmetros
- bytes
- Byte*
Um apontador para o primeiro byte a descodificar.
- byteCount
- Int32
O número de bytes a descodificar.
- chars
- Char*
Um indicador para o local onde começar a escrever o conjunto resultante de caracteres.
- charCount
- Int32
O número máximo de caracteres para escrever.
Devoluções
O número real de caracteres escritos no local indicado pelo chars parâmetro.
- Atributos
Exceções
byteCount ou charCount é inferior a zero.
charCount é inferior ao número resultante de caracteres.
Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)
- e -
DecoderFallback está definido como DecoderExceptionFallback.
Observações
Para calcular o tamanho exato do array que GetChars requer armazenar os caracteres resultantes, deve usar o GetCharCount método. Para calcular o tamanho máximo do array, use o GetMaxCharCount método. O GetCharCount método geralmente permite a alocação de menos memória, enquanto o GetMaxCharCount método geralmente é executado mais rapidamente.
Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.
Se os dados a converter estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precisa de ser dividida em blocos mais pequenos, deve usar o Decoder ou o Encoder objeto fornecido pelo GetDecoder ou o GetEncoder método, respetivamente, de uma classe derivada.
Note
Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.
O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.
Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:
A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)
Se a sua aplicação gerir as saídas de strings, o GetString método é recomendado. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.
A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.
Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.
Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.
Ver também
Aplica-se a
GetChars(ReadOnlySpan<Byte>, Span<Char>)
Quando sobrescrito numa classe derivada, decodifica todos os bytes do intervalo de bytes especificado para apenas leitura num espaço de caracteres.
public:
virtual int GetChars(ReadOnlySpan<System::Byte> bytes, Span<char> chars);
public virtual int GetChars(ReadOnlySpan<byte> bytes, Span<char> chars);
abstract member GetChars : ReadOnlySpan<byte> * Span<char> -> int
override this.GetChars : ReadOnlySpan<byte> * Span<char> -> int
Public Overridable Function GetChars (bytes As ReadOnlySpan(Of Byte), chars As Span(Of Char)) As Integer
Parâmetros
- bytes
- ReadOnlySpan<Byte>
Um span de apenas leitura contendo a sequência de bytes a decodificar.
Devoluções
O número real de caracteres escritos no espaço indicado pelo chars parâmetro.
Observações
Encoding.GetChars obtém caracteres a partir de um intervalo de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.
Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.
O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.
Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:
A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)
Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.
A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.
Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.
Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.
Aplica-se a
GetChars(Byte[])
Quando sobrescrito numa classe derivada, descodifica todos os bytes do array de bytes especificado num conjunto de caracteres.
public:
virtual cli::array <char> ^ GetChars(cli::array <System::Byte> ^ bytes);
public virtual char[] GetChars(byte[] bytes);
abstract member GetChars : byte[] -> char[]
override this.GetChars : byte[] -> char[]
Public Overridable Function GetChars (bytes As Byte()) As Char()
Parâmetros
- bytes
- Byte[]
O array de bytes que contém a sequência de bytes a decodificar.
Devoluções
Um array de caracteres contendo os resultados da decodificação da sequência especificada de bytes.
Exceções
bytes é null.
Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)
- e -
DecoderFallback está definido como DecoderExceptionFallback.
Exemplos
O exemplo seguinte codifica uma string num array de bytes, e depois descodifica os bytes num array de caracteres.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Encoding u32LE = Encoding.GetEncoding( "utf-32" );
Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );
// Use a 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 myStr = "za\u0306\u01FD\u03B2";
// Encode the string using the big-endian byte order.
byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );
// Encode the string using the little-endian byte order.
byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );
// Get the char counts, and decode the byte arrays.
Console.Write( "BE array with BE encoding : " );
PrintCountsAndChars( barrBE, u32BE );
Console.Write( "LE array with LE encoding : " );
PrintCountsAndChars( barrLE, u32LE );
}
public static void PrintCountsAndChars( byte[] bytes, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-25} :", enc.ToString() );
// Display the exact character count.
int iCC = enc.GetCharCount( bytes );
Console.Write( " {0,-3}", iCC );
// Display the maximum character count.
int iMCC = enc.GetMaxCharCount( bytes.Length );
Console.Write( " {0,-3} :", iMCC );
// Decode the bytes and display the characters.
char[] chars = enc.GetChars( bytes );
Console.WriteLine( chars );
}
}
/*
This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
BE array with BE encoding : System.Text.UTF32Encoding : 5 12 :zăǽβ
LE array with LE encoding : System.Text.UTF32Encoding : 5 12 :zăǽβ
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
Dim u32BE As Encoding = Encoding.GetEncoding("utf-32BE")
' Use a 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 myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)
' Encode the string using the big-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)
' Encode the string using the little-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
u32LE.GetBytes(myStr, 0, myStr.Length, barrLE, 0)
' Get the char counts, and decode the byte arrays.
Console.Write("BE array with BE encoding : ")
PrintCountsAndChars(barrBE, u32BE)
Console.Write("LE array with LE encoding : ")
PrintCountsAndChars(barrLE, u32LE)
End Sub
Public Shared Sub PrintCountsAndChars(bytes() As Byte, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-25} :", enc.ToString())
' Display the exact character count.
Dim iCC As Integer = enc.GetCharCount(bytes)
Console.Write(" {0,-3}", iCC)
' Display the maximum character count.
Dim iMCC As Integer = enc.GetMaxCharCount(bytes.Length)
Console.Write(" {0,-3} :", iMCC)
' Decode the bytes and display the characters.
Dim chars As Char() = enc.GetChars(bytes)
Console.WriteLine(chars)
End Sub
End Class
'This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
'
'BE array with BE encoding : System.Text.UTF32Encoding : 5 12 :zăǽβ
'LE array with LE encoding : System.Text.UTF32Encoding : 5 12 :zăǽβ
Observações
Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.
Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.
Note
Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.
O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.
Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:
A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)
Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.
A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.
Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.
Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.
Ver também
Aplica-se a
GetChars(Byte[], Int32, Int32)
Quando sobrescrito numa classe derivada, decodifica uma sequência de bytes do array de bytes especificado num conjunto de caracteres.
public:
virtual cli::array <char> ^ GetChars(cli::array <System::Byte> ^ bytes, int index, int count);
public virtual char[] GetChars(byte[] bytes, int index, int count);
abstract member GetChars : byte[] * int * int -> char[]
override this.GetChars : byte[] * int * int -> char[]
Public Overridable Function GetChars (bytes As Byte(), index As Integer, count As Integer) As Char()
Parâmetros
- bytes
- Byte[]
O array de bytes que contém a sequência de bytes a decodificar.
- index
- Int32
O índice do primeiro byte a descodificar.
- count
- Int32
O número de bytes a descodificar.
Devoluções
Um array de caracteres contendo os resultados da decodificação da sequência especificada de bytes.
Exceções
bytes é null.
index ou count é inferior a zero.
-ou-
index e count não denotam um intervalo válido em bytes.
Ocorreu um recurso de recurso (para mais informações, veja Codificação de Caracteres em .NET)
- e -
DecoderFallback está definido como DecoderExceptionFallback.
Exemplos
O exemplo seguinte codifica uma cadeia num array de bytes, e depois descodifica um intervalo desses bytes num array de caracteres.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Encoding u32LE = Encoding.GetEncoding( "utf-32" );
Encoding u32BE = Encoding.GetEncoding( "utf-32BE" );
// Use a 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 myStr = "za\u0306\u01FD\u03B2";
// Encode the string using the big-endian byte order.
byte[] barrBE = new byte[u32BE.GetByteCount( myStr )];
u32BE.GetBytes( myStr, 0, myStr.Length, barrBE, 0 );
// Encode the string using the little-endian byte order.
byte[] barrLE = new byte[u32LE.GetByteCount( myStr )];
u32LE.GetBytes( myStr, 0, myStr.Length, barrLE, 0 );
// Get the char counts, decode eight bytes starting at index 0,
// and print out the counts and the resulting bytes.
Console.Write( "BE array with BE encoding : " );
PrintCountsAndChars( barrBE, 0, 8, u32BE );
Console.Write( "LE array with LE encoding : " );
PrintCountsAndChars( barrLE, 0, 8, u32LE );
}
public static void PrintCountsAndChars( byte[] bytes, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-25} :", enc.ToString() );
// Display the exact character count.
int iCC = enc.GetCharCount( bytes, index, count );
Console.Write( " {0,-3}", iCC );
// Display the maximum character count.
int iMCC = enc.GetMaxCharCount( count );
Console.Write( " {0,-3} :", iMCC );
// Decode the bytes and display the characters.
char[] chars = enc.GetChars( bytes, index, count );
// The following is an alternative way to decode the bytes:
// char[] chars = new char[iCC];
// enc.GetChars( bytes, index, count, chars, 0 );
Console.WriteLine( chars );
}
}
/*
This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
BE array with BE encoding : System.Text.UTF32Encoding : 2 6 :za
LE array with LE encoding : System.Text.UTF32Encoding : 2 6 :za
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' Create two instances of UTF32Encoding: one with little-endian byte order and one with big-endian byte order.
Dim u32LE As Encoding = Encoding.GetEncoding("utf-32")
Dim u32BE As Encoding = Encoding.GetEncoding("utf-32BE")
' Use a 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 myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2)
' Encode the string using the big-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates barrBE with the exact number of elements required.
Dim barrBE(u32BE.GetByteCount(myStr) - 1) As Byte
u32BE.GetBytes(myStr, 0, myStr.Length, barrBE, 0)
' Encode the string using the little-endian byte order.
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates barrLE with the exact number of elements required.
Dim barrLE(u32LE.GetByteCount(myStr) - 1) As Byte
u32LE.GetBytes(myStr, 0, myStr.Length, barrLE, 0)
' Get the char counts, decode eight bytes starting at index 0,
' and print out the counts and the resulting bytes.
Console.Write("BE array with BE encoding : ")
PrintCountsAndChars(barrBE, 0, 8, u32BE)
Console.Write("LE array with LE encoding : ")
PrintCountsAndChars(barrLE, 0, 8, u32LE)
End Sub
Public Shared Sub PrintCountsAndChars(bytes() As Byte, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-25} :", enc.ToString())
' Display the exact character count.
Dim iCC As Integer = enc.GetCharCount(bytes, index, count)
Console.Write(" {0,-3}", iCC)
' Display the maximum character count.
Dim iMCC As Integer = enc.GetMaxCharCount(count)
Console.Write(" {0,-3} :", iMCC)
' Decode the bytes.
Dim chars As Char() = enc.GetChars(bytes, index, count)
' The following is an alternative way to decode the bytes:
' NOTE: In VB.NET, arrays contain one extra element by default.
' The following line creates the array with the exact number of elements required.
' Dim chars(iCC - 1) As Char
' enc.GetChars( bytes, index, count, chars, 0 )
' Display the characters.
Console.WriteLine(chars)
End Sub
End Class
'This code produces the following output. The question marks take the place of characters that cannot be displayed at the console.
'
'BE array with BE encoding : System.Text.UTF32Encoding : 2 6 :za
'LE array with LE encoding : System.Text.UTF32Encoding : 2 6 :za
Observações
Encoding.GetChars obtém caracteres a partir de uma sequência de bytes de entrada. Encoding.GetChars é diferente de Decoder.GetChars porque Encoding espera conversões discretas, enquanto Decoder é concebido para múltiplas passagens num único fluxo de entrada.
Se os dados a serem convertidos estiverem disponíveis apenas em blocos sequenciais (como dados lidos de um fluxo) ou se a quantidade de dados for tão grande que precise ser dividida em blocos menores, você deverá usar o Decoder ou o Encoder fornecidos pelo método GetDecoder ou pelo método GetEncoder, respectivamente, de uma classe derivada.
Note
Este método destina-se a operar sobre caracteres Unicode, não sobre dados binários arbitrários, como arrays de bytes. Se precisar de codificar dados binários arbitrários em texto, deve usar um protocolo como o uuencode, que é implementado por métodos como Convert.ToBase64CharArray.
O GetCharCount método determina quantos caracteres resultam na decodificação de uma sequência de bytes, e o GetChars método realiza a decodificação propriamente dita. O Encoding.GetChars método espera conversões discretas, ao contrário do Decoder.GetChars método, que lida com múltiplas passagens num único fluxo de entrada.
Várias versões de GetCharCount e GetChars são suportadas. Seguem-se algumas considerações de programação para a utilização destes métodos:
A sua aplicação pode precisar de decodificar múltiplos bytes de entrada a partir de uma página de código e processar esses bytes usando várias chamadas. Neste caso, provavelmente precisa de manter o estado entre chamadas, porque as sequências de bytes podem ser interrompidas quando processadas em lotes. (Por exemplo, parte de uma sequência de deslocamento ISO-2022 pode terminar uma GetChars chamada e continuar no início da chamada seguinte GetChars . Encoding.GetChars chamará a reserva para essas sequências incompletas, mas Decoder memorizará essas sequências para a chamada seguinte.)
Se a sua aplicação gerir as saídas das cadeias, recomenda-se usar o GetString método. Como este método deve verificar o comprimento da corda e alocar um buffer, é ligeiramente mais lento, mas o tipo resultante String é preferível.
A versão em bytes permite GetChars(Byte*, Int32, Char*, Int32) algumas técnicas rápidas, particularmente com múltiplas chamadas para buffers grandes. Tenha em mente, no entanto, que esta versão do método por vezes não é segura, pois são necessários ponteiros.
Se a sua aplicação tiver de converter uma grande quantidade de dados, deve reutilizar o buffer de saída. Neste caso, a GetChars(Byte[], Int32, Int32, Char[], Int32) versão que suporta buffers de caracteres de saída é a melhor escolha.
Considere usar o Decoder.Convert método em vez de GetCharCount. O método de conversão converte o máximo de dados possível e lança uma exceção se o buffer de saída for demasiado pequeno. Para a decodificação contínua de um fluxo, este método é frequentemente a melhor escolha.