UTF32Encoding.GetBytes 方法

定義

將一組字元編碼成一串位元組。

多載

名稱 Description
GetBytes(Char*, Int32, Byte*, Int32)

將一組從指定字元指標開始的字元編碼成一串位元組,並從指定位元組指標開始儲存。

GetBytes(Char[], Int32, Int32, Byte[], Int32)

將指定字元陣列中的一組字元編碼到指定的位元組陣列中。

GetBytes(String, Int32, Int32, Byte[], Int32)

將指定的 String 一組字元編碼到指定的位元組陣列中。

GetBytes(Char*, Int32, Byte*, Int32)

重要

此 API 不符合 CLS 規範。

將一組從指定字元指標開始的字元編碼成一串位元組,並從指定位元組指標開始儲存。

public:
 override int GetBytes(char* chars, int charCount, System::Byte* bytes, int byteCount);
[System.CLSCompliant(false)]
[System.Security.SecurityCritical]
public override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[System.CLSCompliant(false)]
public override int GetBytes(char* chars, int charCount, byte* bytes, int byteCount);
[<System.CLSCompliant(false)>]
[<System.Security.SecurityCritical>]
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int
[<System.CLSCompliant(false)>]
override this.GetBytes : nativeptr<char> * int * nativeptr<byte> * int -> int

參數

chars
Char*

一個指向第一個要編碼字元的指標。

charCount
Int32

需要編碼的字元數。

bytes
Byte*

一個指向開始寫入產生的位元組序列位置的指標。

byteCount
Int32

最大可寫入位元組數。

傳回

參數所示 bytes 位置實際寫入的位元組數。

屬性

例外狀況

charsnull

-或-

bytesnull

charCountbyteCount 小於零。

錯誤偵測已啟用,但 chars 包含無效的字元序列。

-或-

byteCount 小於所得位元組數。

後來出現了備用機制(更多資訊請參見 .NET 中的字元編碼

-及-

EncoderFallback 設定為 EncoderExceptionFallback

備註

要計算儲存所得位元組所需的 GetBytes 精確陣列大小,你就呼叫了 方法 GetByteCount 。 要計算最大陣列大小,你呼叫 方法 GetMaxByteCount 。 此 GetByteCount 方法通常分配較少記憶體,而 GetMaxByteCount 執行速度較快。

在錯誤檢測中,若序列無效,該方法會拋出 ArgumentException。 若無錯誤偵測,無效序列會被忽略,且不會拋出例外。

待轉換的資料,例如從串流讀取的資料,可能只能以連續區塊形式取得。 在這種情況下,或資料量龐大到需要分割成較小區塊時,應用程式會分別使用Decoder方法或GetEncoder方法所提供的 GetDecoderEncoder

Important

為了確保編碼的位元組在儲存為檔案或串流時能正確解碼,你可以在編碼位元組串流前加上前言。 在位元組串流開頭插入前導碼(例如在一連串要寫入檔案的位元組開頭)是開發者的責任。 此 GetBytes 方法不會在編碼位元組序列的開頭前加上前言。

另請參閱

適用於

GetBytes(Char[], Int32, Int32, Byte[], Int32)

將指定字元陣列中的一組字元編碼到指定的位元組陣列中。

public:
 override int GetBytes(cli::array <char> ^ chars, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public override int GetBytes(char[] chars, int charIndex, int charCount, byte[] bytes, int byteIndex);
override this.GetBytes : char[] * int * int * byte[] * int -> int
Public Overrides Function GetBytes (chars As Char(), charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

參數

chars
Char[]

包含要編碼字元集合的字元陣列。

charIndex
Int32

第一個要編碼字元的索引。

charCount
Int32

需要編碼的字元數。

bytes
Byte[]

這個位元組陣列用來包含產生的位元組序列。

byteIndex
Int32

索引開始寫入產生的位元組序列。

傳回

寫入 bytes的實際位元組數。

例外狀況

charsnull

-或-

bytesnull

charIndexcharCountbyteIndex 小於零。

-或-

charIndexcharCount 不表示在 中的 chars有效範圍。

-或-

byteIndex 在 中 不是有效的指標 bytes

錯誤偵測已啟用,但 chars 包含無效的字元序列。

-或-

bytes 從陣列到末端的容量 byteIndex 不足以容納產生的位元組。

後來出現了備用機制(更多資訊請參見 .NET 中的字元編碼

-及-

EncoderFallback 設定為 EncoderExceptionFallback

範例

以下範例決定從一個字元陣列編碼三個字元所需的位元組數,然後編碼這些字元並顯示所得位元組。

using System;
using System.Text;

public class SamplesUTF32Encoding  {

   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[7] { 'z', 'a', '\u0306', '\u01FD', '\u03B2', '\uD8FF', '\uDCFF' };

      // Create instances of different encodings.
      UTF7Encoding  u7       = new UTF7Encoding();
      UTF8Encoding  u8Nobom  = new UTF8Encoding( false, true );
      UTF8Encoding  u8Bom    = new UTF8Encoding( true,  true );
      UTF32Encoding u32Nobom = new UTF32Encoding( false, false, true );
      UTF32Encoding u32Bom   = new UTF32Encoding( false, true,  true );

      // 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, u8Nobom );
      PrintCountsAndBytes( myChars, 4, 3, u8Bom );
      PrintCountsAndBytes( myChars, 4, 3, u32Nobom );
      PrintCountsAndBytes( myChars, 4, 3, u32Bom );
   }

   public static void PrintCountsAndBytes( char[] chars, int index, int count, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-25} :", 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 );

      // Get the byte order mark, if any.
      byte[] preamble = enc.GetPreamble();

      // Combine the preamble and the encoded bytes.
      byte[] bytes = new byte[preamble.Length + iBC];
      Array.Copy( preamble, bytes, preamble.Length );
      enc.GetBytes( chars, index, count, bytes, preamble.Length );

      // 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.UTF8Encoding  : 6   12  :EF BB BF CE B2 F1 8F B3 BF
System.Text.UTF32Encoding : 8   12  :B2 03 00 00 FF FC 04 00
System.Text.UTF32Encoding : 8   12  :FF FE 00 00 B2 03 00 00 FF FC 04 00

*/
Imports System.Text

Public Class SamplesUTF32Encoding   

   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)}

      ' Create instances of different encodings.
      Dim u7 As New UTF7Encoding()
      Dim u8Nobom As New UTF8Encoding(False, True)
      Dim u8Bom As New UTF8Encoding(True, True)
      Dim u32Nobom As New UTF32Encoding(False, False, True)
      Dim u32Bom As New UTF32Encoding(False, True, True)

      ' 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, u8Nobom)
      PrintCountsAndBytes(myChars, 4, 3, u8Bom)
      PrintCountsAndBytes(myChars, 4, 3, u32Nobom)
      PrintCountsAndBytes(myChars, 4, 3, u32Bom)

   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,-25} :", 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)

      ' Get the byte order mark, if any.
      Dim preamble As Byte() = enc.GetPreamble()

      ' Combine the preamble and the encoded bytes.
      ' NOTE: In Visual Basic, arrays contain one extra element by default.
      '       The following line creates an array with the exact number of elements required.
      Dim bytes(preamble.Length + iBC - 1) As Byte
      Array.Copy(preamble, bytes, preamble.Length)
      enc.GetBytes(chars, index, count, bytes, preamble.Length)

      ' 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.UTF8Encoding  : 6   12  :EF BB BF CE B2 F1 8F B3 BF
'System.Text.UTF32Encoding : 8   12  :B2 03 00 00 FF FC 04 00
'System.Text.UTF32Encoding : 8   12  :FF FE 00 00 B2 03 00 00 FF FC 04 00

備註

要計算儲存所得位元組所需的 GetBytes 精確陣列大小,你就呼叫了 方法 GetByteCount 。 要計算最大陣列大小,你呼叫 方法 GetMaxByteCount 。 此 GetByteCount 方法通常分配較少記憶體,而 GetMaxByteCount 執行速度較快。

在錯誤檢測中,若序列無效,該方法會拋出 ArgumentException。 若無錯誤偵測,無效序列會被忽略,且不會拋出例外。

待轉換的資料,例如從串流讀取的資料,可能只能以連續區塊形式取得。 在這種情況下,或資料量龐大到需要分割成較小區塊時,應用程式會分別使用Decoder方法或GetEncoder方法所提供的 GetDecoderEncoder

Important

為了確保編碼的位元組在儲存為檔案或串流時能正確解碼,你可以在編碼位元組串流前加上前言。 在位元組串流開頭插入前導碼(例如在一連串要寫入檔案的位元組開頭)是開發者的責任。 此 GetBytes 方法不會在編碼位元組序列的開頭前加上前言。

另請參閱

適用於

GetBytes(String, Int32, Int32, Byte[], Int32)

將指定的 String 一組字元編碼到指定的位元組陣列中。

public:
 override int GetBytes(System::String ^ s, int charIndex, int charCount, cli::array <System::Byte> ^ bytes, int byteIndex);
public override int GetBytes(string s, int charIndex, int charCount, byte[] bytes, int byteIndex);
override this.GetBytes : string * int * int * byte[] * int -> int
Public Overrides Function GetBytes (s As String, charIndex As Integer, charCount As Integer, bytes As Byte(), byteIndex As Integer) As Integer

參數

s
String

包含 String 要編碼的字元集合。

charIndex
Int32

第一個要編碼字元的索引。

charCount
Int32

需要編碼的字元數。

bytes
Byte[]

這個位元組陣列用來包含產生的位元組序列。

byteIndex
Int32

索引開始寫入產生的位元組序列。

傳回

寫入 bytes的實際位元組數。

例外狀況

snull

-或-

bytesnull

charIndexcharCountbyteIndex 小於零。

-或-

charIndexcharCount 不表示在 中的 s有效範圍。

-或-

byteIndex 在 中 不是有效的指標 bytes

錯誤偵測已啟用,但 s 包含無效的字元序列。

-或-

bytes 從陣列到末端的容量 byteIndex 不足以容納產生的位元組。

後來出現了備用機制(更多資訊請參見 .NET 中的字元編碼

-及-

EncoderFallback 設定為 EncoderExceptionFallback

範例

以下範例決定編碼字串所需的位元組數,然後編碼字串並顯示所得位元組。

using System;
using System.Text;

public class SamplesUTF32Encoding  {

   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";

      // Create instances of different encodings.
      UTF7Encoding  u7       = new UTF7Encoding();
      UTF8Encoding  u8Nobom  = new UTF8Encoding( false, true );
      UTF8Encoding  u8Bom    = new UTF8Encoding( true,  true );
      UTF32Encoding u32Nobom = new UTF32Encoding( false, false, true );
      UTF32Encoding u32Bom   = new UTF32Encoding( false, true,  true );

      // Get the byte counts and the bytes.
      PrintCountsAndBytes( myStr, u7 );
      PrintCountsAndBytes( myStr, u8Nobom );
      PrintCountsAndBytes( myStr, u8Bom );
      PrintCountsAndBytes( myStr, u32Nobom );
      PrintCountsAndBytes( myStr, u32Bom );
   }

   public static void PrintCountsAndBytes( String s, Encoding enc )  {

      // Display the name of the encoding used.
      Console.Write( "{0,-25} :", 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 );

      // Get the byte order mark, if any.
      byte[] preamble = enc.GetPreamble();

      // Combine the preamble and the encoded bytes.
      byte[] bytes = new byte[preamble.Length + iBC];
      Array.Copy( preamble, bytes, preamble.Length );
      enc.GetBytes( s, 0, s.Length, bytes, preamble.Length );

      // 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.UTF8Encoding  : 12  24  :EF BB BF 7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
System.Text.UTF32Encoding : 24  28  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
System.Text.UTF32Encoding : 24  28  :FF FE 00 00 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 SamplesUTF32Encoding   

   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)

      ' Create instances of different encodings.
      Dim u7 As New UTF7Encoding()
      Dim u8Nobom As New UTF8Encoding(False, True)
      Dim u8Bom As New UTF8Encoding(True, True)
      Dim u32Nobom As New UTF32Encoding(False, False, True)
      Dim u32Bom As New UTF32Encoding(False, True, True)

      ' Get the byte counts and the bytes.
      PrintCountsAndBytes(myStr, u7)
      PrintCountsAndBytes(myStr, u8Nobom)
      PrintCountsAndBytes(myStr, u8Bom)
      PrintCountsAndBytes(myStr, u32Nobom)
      PrintCountsAndBytes(myStr, u32Bom)

   End Sub


   Public Shared Sub PrintCountsAndBytes(s As String, enc As Encoding)

      ' Display the name of the encoding used.
      Console.Write("{0,-25} :", 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)

      ' Get the byte order mark, if any.
      Dim preamble As Byte() = enc.GetPreamble()

      ' Combine the preamble and the encoded bytes.
      ' NOTE: In Visual Basic, arrays contain one extra element by default.
      '       The following line creates an array with the exact number of elements required.
      Dim bytes(preamble.Length + iBC - 1) As Byte
      Array.Copy(preamble, bytes, preamble.Length)
      enc.GetBytes(s, 0, s.Length, bytes, preamble.Length)

      ' 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.UTF8Encoding  : 12  24  :EF BB BF 7A 61 CC 86 C7 BD CE B2 F1 8F B3 BF
'System.Text.UTF32Encoding : 24  28  :7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00
'System.Text.UTF32Encoding : 24  28  :FF FE 00 00 7A 00 00 00 61 00 00 00 06 03 00 00 FD 01 00 00 B2 03 00 00 FF FC 04 00

備註

要計算儲存所得位元組所需的 GetBytes 精確陣列大小,你就呼叫了 方法 GetByteCount 。 要計算最大陣列大小,你呼叫 方法 GetMaxByteCount 。 此 GetByteCount 方法通常分配較少記憶體,而 GetMaxByteCount 執行速度較快。

在錯誤檢測中,若序列無效,該方法會拋出 ArgumentException。 若無錯誤偵測,無效序列會被忽略,且不會拋出例外。

待轉換的資料,例如從串流讀取的資料,可能只能以連續區塊形式取得。 在這種情況下,或資料量龐大到需要分割成較小區塊時,應用程式會分別使用Decoder方法或GetEncoder方法所提供的 GetDecoderEncoder

Important

為了確保編碼的位元組在儲存為檔案或串流時能正確解碼,你可以在編碼位元組串流前加上前言。 在位元組串流開頭插入前導碼(例如在一連串要寫入檔案的位元組開頭)是開發者的責任。 此 GetBytes 方法不會在編碼位元組序列的開頭前加上前言。

另請參閱

適用於