Encoding.GetBytes Methode
Definitie
Belangrijk
Bepaalde informatie heeft betrekking op een voorlopige productversie die aanzienlijk kan worden gewijzigd voordat deze wordt uitgebracht. Microsoft biedt geen enkele expliciete of impliciete garanties met betrekking tot de informatie die hier wordt verstrekt.
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een reeks tekens in een reeks bytes.
Overloads
| Name | Description |
|---|---|
| GetBytes(Char[]) |
Wanneer deze worden overschreven in een afgeleide klasse, codeert u alle tekens in de opgegeven tekenmatrix in een reeks bytes. |
| GetBytes(String) |
Wanneer deze worden overschreven in een afgeleide klasse, codeert u alle tekens in de opgegeven tekenreeks in een reeks bytes. |
| GetBytes(ReadOnlySpan<Char>, Span<Byte>) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u in een reeks bytes die een reeks tekens bevat van de opgegeven alleen-lezen periode. |
| GetBytes(Char[], Int32, Int32) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenmatrix in een reeks bytes. |
| GetBytes(String, Int32, Int32) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u in een matrix van bytes het aantal tekens dat is opgegeven in |
| GetBytes(Char*, Int32, Byte*, Int32) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een reeks tekens die beginnen bij de opgegeven tekenwijzer in een reeks bytes die zijn opgeslagen vanaf de opgegeven byte-aanwijzer. |
| GetBytes(Char[], Int32, Int32, Byte[], Int32) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenmatrix in de opgegeven bytematrix. |
| GetBytes(String, Int32, Int32, Byte[], Int32) |
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenreeks in de opgegeven bytematrix. |
GetBytes(Char[])
Wanneer deze worden overschreven in een afgeleide klasse, codeert u alle tekens in de opgegeven tekenmatrix in een reeks bytes.
public:
virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars);
public virtual byte[] GetBytes(char[] chars);
abstract member GetBytes : char[] -> byte[]
override this.GetBytes : char[] -> byte[]
Public Overridable Function GetBytes (chars As Char()) As Byte()
Parameters
- chars
- Char[]
De tekenmatrix die de tekens bevat die moeten worden gecodeerd.
Retouren
Een bytematrix met de resultaten van het coderen van de opgegeven set tekens.
Uitzonderingen
chars is null.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat is vereist om een tekenmatrix te coderen, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire array, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, u7 );
PrintCountsAndBytes( myChars, u8 );
PrintCountsAndBytes( myChars, u16LE );
PrintCountsAndBytes( myChars, u16BE );
PrintCountsAndBytes( myChars, u32 );
}
public static void PrintCountsAndBytes( char[] chars, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( chars.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF)}
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire array, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, u7)
PrintCountsAndBytes(myChars, u8)
PrintCountsAndBytes(myChars, u16LE)
PrintCountsAndBytes(myChars, u16BE)
PrintCountsAndBytes(myChars, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(chars.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Opmerkingen
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van de GetBytes methode aanroepen.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Zie ook
Van toepassing op
GetBytes(String)
Wanneer deze worden overschreven in een afgeleide klasse, codeert u alle tekens in de opgegeven tekenreeks in een reeks bytes.
public:
virtual cli::array <System::Byte> ^ GetBytes(System::String ^ s);
public virtual byte[] GetBytes(string s);
abstract member GetBytes : string -> byte[]
override this.GetBytes : string -> byte[]
Public Overridable Function GetBytes (s As String) As Byte()
Parameters
- s
- String
De tekenreeks met de tekens die moeten worden gecodeerd.
Retouren
Een bytematrix met de resultaten van het coderen van de opgegeven set tekens.
Uitzonderingen
s is null.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat nodig is om een tekenreeks of een bereik in de tekenreeks te coderen, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Opmerkingen
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Zie ook
Van toepassing op
GetBytes(ReadOnlySpan<Char>, Span<Byte>)
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u in een reeks bytes die een reeks tekens bevat van de opgegeven alleen-lezen periode.
public:
virtual int GetBytes(ReadOnlySpan<char> chars, Span<System::Byte> bytes);
public virtual int GetBytes(ReadOnlySpan<char> chars, Span<byte> bytes);
abstract member GetBytes : ReadOnlySpan<char> * Span<byte> -> int
override this.GetBytes : ReadOnlySpan<char> * Span<byte> -> int
Public Overridable Function GetBytes (chars As ReadOnlySpan(Of Char), bytes As Span(Of Byte)) As Integer
Parameters
- chars
- ReadOnlySpan<Char>
De reeks tekens die moeten worden gecodeerd.
Retouren
Het aantal gecodeerde bytes.
Opmerkingen
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Van toepassing op
GetBytes(Char[], Int32, Int32)
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenmatrix in een reeks bytes.
public:
virtual cli::array <System::Byte> ^ GetBytes(cli::array <char> ^ chars, int index, int count);
public virtual byte[] GetBytes(char[] chars, int index, int count);
abstract member GetBytes : char[] * int * int -> byte[]
override this.GetBytes : char[] * int * int -> byte[]
Public Overridable Function GetBytes (chars As Char(), index As Integer, count As Integer) As Byte()
Parameters
- chars
- Char[]
De tekenmatrix die de set tekens bevat die moeten worden gecodeerd.
- index
- Int32
De index van het eerste teken om te coderen.
- count
- Int32
Het aantal tekens dat moet worden gecodeerd.
Retouren
Een bytematrix met de resultaten van het coderen van de opgegeven set tekens.
Uitzonderingen
chars is null.
index of count kleiner is dan nul.
– of –
index en count geef geen geldig bereik aan in chars.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat is vereist om drie tekens te coderen uit een tekenmatrix, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars, index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, 4, 3, u7)
PrintCountsAndBytes(myChars, 4, 3, u8)
PrintCountsAndBytes(myChars, 4, 3, u16LE)
PrintCountsAndBytes(myChars, 4, 3, u16BE)
PrintCountsAndBytes(myChars, 4, 3, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars, index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars, index, count)
' The following is an alternative way to encode the array of chars:
' 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 bytes(iBC - 1) As Byte
' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Opmerkingen
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Zie ook
Van toepassing op
GetBytes(String, Int32, Int32)
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u in een matrix van bytes het aantal tekens dat is opgegeven in count de opgegeven tekenreeks, beginnend bij de opgegeven indextekenreeks.
public:
cli::array <System::Byte> ^ GetBytes(System::String ^ s, int index, int count);
public byte[] GetBytes(string s, int index, int count);
member this.GetBytes : string * int * int -> byte[]
Public Function GetBytes (s As String, index As Integer, count As Integer) As Byte()
Parameters
- s
- String
De tekenreeks met de tekens die moeten worden gecodeerd.
- index
- Int32
De index in de tekenreeks waaruit de codering moet worden gestart.
- count
- Int32
Het aantal tekens dat moet worden gecodeerd.
Retouren
Een bytematrix met de resultaten van het coderen van de opgegeven set tekens.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat nodig is om een tekenreeks of een bereik in de tekenreeks te coderen, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Opmerkingen
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Van toepassing op
GetBytes(Char*, Int32, Byte*, Int32)
Belangrijk
Deze API is niet CLS-conform.
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een reeks tekens die beginnen bij de opgegeven tekenwijzer in een reeks bytes die zijn opgeslagen vanaf de opgegeven byte-aanwijzer.
public:
virtual int GetBytes(char* chars, int charCount, System::Byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
[System.Runtime.InteropServices.ComVisible(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
public virtual int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
[<System.Runtime.InteropServices.ComVisible(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
abstract member GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
Parameters
- chars
- Char*
Een aanwijzer naar het eerste teken om te coderen.
- charCount
- Int32
Het aantal tekens dat moet worden gecodeerd.
- bytes
- Byte*
Een aanwijzer naar de locatie waar de resulterende reeks bytes moet worden geschreven.
- byteCount
- Int32
Het maximum aantal bytes dat moet worden geschreven.
Retouren
Het werkelijke aantal bytes dat is geschreven op de locatie die wordt aangegeven door de bytes parameter.
- Kenmerken
Uitzonderingen
charCount of byteCount kleiner is dan nul.
byteCount is kleiner dan het resulterende aantal bytes.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Opmerkingen
Als u de exacte matrixgrootte wilt berekenen die GetBytes nodig is om de resulterende bytes op te slaan, roept u de GetByteCount methode aan. Als u de maximale matrixgrootte wilt berekenen, roept u de GetMaxByteCount methode aan. Met de GetByteCount methode kan over het algemeen minder geheugen worden toegewezen, terwijl de GetMaxByteCount methode doorgaans sneller wordt uitgevoerd.
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u het Decoder of het Encoder object gebruiken dat wordt geleverd door respectievelijk de GetDecoder methode of de GetEncoder methode van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Zie ook
Van toepassing op
GetBytes(Char[], Int32, Int32, Byte[], Int32)
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenmatrix in de opgegeven bytematrix.
public:
abstract int GetBytes(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public abstract int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : char[] * int * int * byte[] * int -> int
Public MustOverride Function GetBytes (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer
Parameters
- chars
- Char[]
De tekenmatrix die de set tekens bevat die moeten worden gecodeerd.
- charIndex
- Int32
De index van het eerste teken om te coderen.
- charCount
- Int32
Het aantal tekens dat moet worden gecodeerd.
- bytes
- Byte[]
De bytematrix die de resulterende reeks bytes bevat.
- byteIndex
- Int32
De index waarop de resulterende reeks bytes moet worden geschreven.
Retouren
Het werkelijke aantal bytes dat is geschreven in bytes.
Uitzonderingen
charIndex of charCountbyteIndex kleiner is dan nul.
– of –
charIndex en charCount geef geen geldig bereik aan in chars.
– of –
byteIndex is geen geldige index in bytes.
bytes heeft niet voldoende capaciteit van byteIndex tot het einde van de matrix voor de resulterende bytes.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat is vereist om drie tekens te coderen uit een tekenmatrix, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
char[] myChars = new char[] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes( myChars, 4, 3, u7 );
PrintCountsAndBytes( myChars, 4, 3, u8 );
PrintCountsAndBytes( myChars, 4, 3, u16LE );
PrintCountsAndBytes( myChars, 4, 3, u16BE );
PrintCountsAndBytes( myChars, 4, 3, u32 );
}
public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( chars, index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode the array of chars.
byte[] bytes = enc.GetBytes( chars, index, count );
// The following is an alternative way to encode the array of chars:
// byte[] bytes = new byte[iBC];
// enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myChars() As Char = {"z"c, "a"c, ChrW(&H0306), ChrW(&H01FD), ChrW(&H03B2), ChrW(&HD8FF), ChrW(&HDCFF) }
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
PrintCountsAndBytes(myChars, 4, 3, u7)
PrintCountsAndBytes(myChars, 4, 3, u8)
PrintCountsAndBytes(myChars, 4, 3, u16LE)
PrintCountsAndBytes(myChars, 4, 3, u16BE)
PrintCountsAndBytes(myChars, 4, 3, u32)
End Sub
Public Shared Sub PrintCountsAndBytes(chars() As Char, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(chars, index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode the array of chars.
Dim bytes As Byte() = enc.GetBytes(chars, index, count)
' The following is an alternative way to encode the array of chars:
' 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 bytes(iBC - 1) As Byte
' enc.GetBytes( chars, index, count, bytes, bytes.GetLowerBound(0) )
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Opmerkingen
Als u de exacte matrixgrootte wilt berekenen die is vereist voor GetBytes het opslaan van de resulterende bytes, moet u de GetByteCount methode aanroepen. Als u de maximale matrixgrootte wilt berekenen, roept u de GetMaxByteCount methode aan. Met de GetByteCount methode kan over het algemeen minder geheugen worden toegewezen, terwijl de GetMaxByteCount methode doorgaans sneller wordt uitgevoerd.
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.
Zie ook
Van toepassing op
GetBytes(String, Int32, Int32, Byte[], Int32)
Wanneer deze wordt overschreven in een afgeleide klasse, codeert u een set tekens van de opgegeven tekenreeks in de opgegeven bytematrix.
public:
virtual int GetBytes(System::String ^ s, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public virtual int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex);
abstract member GetBytes : string * int * int * byte[] * int -> int
override this.GetBytes : string * int * int * byte[] * int -> int
Public Overridable Function GetBytes (s As String, charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer
Parameters
- s
- String
De tekenreeks die de set tekens bevat die moeten worden gecodeerd.
- charIndex
- Int32
De index van het eerste teken om te coderen.
- charCount
- Int32
Het aantal tekens dat moet worden gecodeerd.
- bytes
- Byte[]
De bytematrix die de resulterende reeks bytes bevat.
- byteIndex
- Int32
De index waarop de resulterende reeks bytes moet worden geschreven.
Retouren
Het werkelijke aantal bytes dat is geschreven in bytes.
Uitzonderingen
charIndex of charCountbyteIndex kleiner is dan nul.
– of –
charIndex en charCount geef geen geldig bereik aan in s.
– of –
byteIndex is geen geldige index in bytes.
bytes heeft niet voldoende capaciteit van byteIndex tot het einde van de matrix voor de resulterende bytes.
Er is een terugval opgetreden (zie Character Encoding in .NET)
en
EncoderFallback is ingesteld op EncoderExceptionFallback.
Voorbeelden
In het volgende voorbeeld wordt het aantal bytes bepaald dat nodig is om een tekenreeks of een bereik in de tekenreeks te coderen, de tekens te coderen en de resulterende bytes weer te geven.
using System;
using System.Text;
public class SamplesEncoding {
public static void Main() {
// The characters to encode:
// 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)
// a high-surrogate value (U+D8FF)
// a low-surrogate value (U+DCFF)
String myStr = "za\u0306\u01FD\u03B2\uD8FF\uDCFF";
// Get different encodings.
Encoding u7 = Encoding.UTF7;
Encoding u8 = Encoding.UTF8;
Encoding u16LE = Encoding.Unicode;
Encoding u16BE = Encoding.BigEndianUnicode;
Encoding u32 = Encoding.UTF32;
// Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the entire string:" );
PrintCountsAndBytes( myStr, u7 );
PrintCountsAndBytes( myStr, u8 );
PrintCountsAndBytes( myStr, u16LE );
PrintCountsAndBytes( myStr, u16BE );
PrintCountsAndBytes( myStr, u32 );
Console.WriteLine();
// Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine( "Encoding the characters from index 4 through 6:" );
PrintCountsAndBytes( myStr, 4, 3, u7 );
PrintCountsAndBytes( myStr, 4, 3, u8 );
PrintCountsAndBytes( myStr, 4, 3, u16LE );
PrintCountsAndBytes( myStr, 4, 3, u16BE );
PrintCountsAndBytes( myStr, 4, 3, u32 );
}
public static void PrintCountsAndBytes( String s, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( s.Length );
Console.Write( " {0,-3} :", iMBC );
// Encode the entire string.
byte[] bytes = enc.GetBytes( s );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintCountsAndBytes( String s, int index, int count, Encoding enc ) {
// Display the name of the encoding used.
Console.Write( "{0,-30} :", enc.ToString() );
// Display the exact byte count.
int iBC = enc.GetByteCount( s.ToCharArray(), index, count );
Console.Write( " {0,-3}", iBC );
// Display the maximum byte count.
int iMBC = enc.GetMaxByteCount( count );
Console.Write( " {0,-3} :", iMBC );
// Encode a range of characters in the string.
byte[] bytes = new byte[iBC];
enc.GetBytes( s, index, count, bytes, bytes.GetLowerBound(0) );
// Display all the encoded bytes.
PrintHexBytes( bytes );
}
public static void PrintHexBytes( byte[] bytes ) {
if (( bytes == null ) || ( bytes.Length == 0 ))
{
Console.WriteLine( "<none>" );
}
else {
for ( int i = 0; i < bytes.Length; i++ )
Console.Write( "{0:X2} ", bytes[i] );
Console.WriteLine();
}
}
}
/*
This code produces the following output.
Encoding the entire string:
System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
Encoding the characters from index 4 through 6:
System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
*/
Imports System.Text
Public Class SamplesEncoding
Public Shared Sub Main()
' The characters to encode:
' 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)
' a high-surrogate value (U+D8FF)
' a low-surrogate value (U+DCFF)
Dim myStr As String = "za" & ChrW(&H0306) & ChrW(&H01FD) & ChrW(&H03B2) & ChrW(&HD8FF) & ChrW(&HDCFF)
' Get different encodings.
Dim u7 As Encoding = Encoding.UTF7
Dim u8 As Encoding = Encoding.UTF8
Dim u16LE As Encoding = Encoding.Unicode
Dim u16BE As Encoding = Encoding.BigEndianUnicode
Dim u32 As Encoding = Encoding.UTF32
' Encode the entire string, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the entire string:")
PrintCountsAndBytes(myStr, u7)
PrintCountsAndBytes(myStr, u8)
PrintCountsAndBytes(myStr, u16LE)
PrintCountsAndBytes(myStr, u16BE)
PrintCountsAndBytes(myStr, u32)
Console.WriteLine()
' Encode three characters starting at index 4, and print out the counts and the resulting bytes.
Console.WriteLine("Encoding the characters from index 4 through 6:")
PrintCountsAndBytes(myStr, 4, 3, u7)
PrintCountsAndBytes(myStr, 4, 3, u8)
PrintCountsAndBytes(myStr, 4, 3, u16LE)
PrintCountsAndBytes(myStr, 4, 3, u16BE)
PrintCountsAndBytes(myStr, 4, 3, u32)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(s.Length)
Console.Write(" {0,-3} :", iMBC)
' Encode the entire string.
Dim bytes As Byte() = enc.GetBytes(s)
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Overloads Public Shared Sub PrintCountsAndBytes(s As String, index As Integer, count As Integer, enc As Encoding)
' Display the name of the encoding used.
Console.Write("{0,-30} :", enc.ToString())
' Display the exact byte count.
Dim iBC As Integer = enc.GetByteCount(s.ToCharArray(), index, count)
Console.Write(" {0,-3}", iBC)
' Display the maximum byte count.
Dim iMBC As Integer = enc.GetMaxByteCount(count)
Console.Write(" {0,-3} :", iMBC)
' Encode a range of characters in the string.
' 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 bytes(iBC - 1) As Byte
enc.GetBytes(s, index, count, bytes, bytes.GetLowerBound(0))
' Display all the encoded bytes.
PrintHexBytes(bytes)
End Sub
Public Shared Sub PrintHexBytes(bytes() As Byte)
If bytes Is Nothing OrElse bytes.Length = 0 Then
Console.WriteLine("<none>")
Else
Dim i As Integer
For i = 0 To bytes.Length - 1
Console.Write("{0:X2} ", bytes(i))
Next i
Console.WriteLine()
End If
End Sub
End Class
'This code produces the following output.
'
'Encoding the entire string:
'System.Text.UTF7Encoding : 18 23 :7A 61 2B 41 77 59 42 2F 51 4F 79 32 50 2F 63 2F 77 2D
'System.Text.UTF8Encoding : 12 24 :7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 14 16 :7A 00 61 00 06 03 FD 01 B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 14 16 :00 7A 00 61 03 06 01 FD 03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 24 32 :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'
'Encoding the characters from index 4 through 6:
'System.Text.UTF7Encoding : 10 11 :2B 41 37 4C 59 2F 39 7A 2F 2D
'System.Text.UTF8Encoding : 6 12 :CE B2 F1 8F B3 BF
'System.Text.UnicodeEncoding : 6 8 :B2 03 FF D8 FF DC
'System.Text.UnicodeEncoding : 6 8 :03 B2 D8 FF DC FF
'System.Text.UTF32Encoding : 8 16 :B2 03 00 00 FF FC 04 00
Opmerkingen
Als u de exacte matrixgrootte wilt berekenen die is vereist voor GetBytes het opslaan van de resulterende bytes, moet u de GetByteCount methode aanroepen. Als u de maximale matrixgrootte wilt berekenen, roept u de GetMaxByteCount methode aan. Met de GetByteCount methode kan over het algemeen minder geheugen worden toegewezen, terwijl de GetMaxByteCount methode doorgaans sneller wordt uitgevoerd.
Als de gegevens die moeten worden geconverteerd alleen beschikbaar zijn in opeenvolgende blokken (zoals gegevens die uit een stroom worden gelezen) of als de hoeveelheid gegevens zo groot is dat deze moet worden onderverdeeld in kleinere blokken, moet u de Decoder of de Encoder gebruiken die wordt geleverd door de GetDecoder methode of de GetEncoder methode, respectievelijk van een afgeleide klasse.
De GetByteCount methode bepaalt hoeveel bytes resulteren in het coderen van een set Unicode-tekens en de GetBytes methode voert de daadwerkelijke codering uit. De Encoding.GetBytes methode verwacht discrete conversies, in tegenstelling tot de Encoder.GetBytes methode, die meerdere conversies op één invoerstroom verwerkt.
Verschillende versies van GetByteCount en GetBytes worden ondersteund. Hier volgen enkele programmeeroverwegingen voor het gebruik van deze methoden:
Uw app moet mogelijk veel invoertekens coderen naar een codepagina en de tekens verwerken met behulp van meerdere aanroepen. In dit geval moet u waarschijnlijk de status tussen aanroepen onderhouden, rekening houdend met de status die wordt behouden door het Encoder object dat wordt gebruikt. (Een tekenreeks met surrogaatparen kan bijvoorbeeld eindigen met een hoge surrogaat. Het Encoder zal onthouden dat een hoog surrogaat, zodat deze kan worden gecombineerd met een laag surrogaat aan het begin van een volgende aanroep. Encoding De status kan dus niet worden gehandhaafd, dus het teken wordt verzonden naar de EncoderFallback.)
Als uw app tekenreeksinvoer verwerkt, moet u de tekenreeksversie van GetBytes.
Met de Unicode-tekenbufferversie zijn GetBytes(Char*, Int32, Byte*, Int32) enkele snelle technieken mogelijk, met name bij meerdere aanroepen met behulp van het Encoder object of het invoegen in bestaande buffers. Houd er echter rekening mee dat deze methodeversie soms onveilig is, omdat aanwijzers vereist zijn.
Als uw app een grote hoeveelheid gegevens moet converteren, moet deze de uitvoerbuffer opnieuw gebruiken. In dit geval is de GetBytes versie die bytematrices ondersteunt de beste keuze.
Overweeg om de Encoder.Convert methode te gebruiken in plaats van GetByteCount. De conversiemethode converteert zoveel mogelijk gegevens en genereert een uitzondering als de uitvoerbuffer te klein is. Voor continue codering van een stream is deze methode vaak de beste keuze.