簡體   English   中英

Encoding.GetString()僅返回字節數組中的第一個字節

[英]Encoding.GetString() only returns first byte from array of bytes

示例,我想將3個字節轉換為ASCII轉換

int a = random.Next(0, 100);
int b = random.Next(0, 1000);
int c = random.Next(0, 30);

byte[] byte1 = BitConverter.GetBytes(a);
byte[] byte2 = BitConverter.GetBytes(b);
byte[] byte3 = BitConverter.GetBytes(c);

byte[] bytes = byte1.Concat(byte2).Concat(byte3).ToArray();
string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

它僅顯示字節1,而不顯示所有字節。

如果您在調試器中查看asciiString變量,您會看到所有3個字母都在那里,但是在這兩個字母之間始終為0x00字符。

(來自LINQPad Dump的屏幕截圖)

在此處輸入圖片說明

不幸的是,這被解釋為string的結尾 因此,這就是為什么您只看到第一個字節/字母的原因。

GetBytes(char)文檔說它返回:

長度為2的字節數組。

如果現在從單個字符獲取字節:

byte[] byte1 = BitConverter.GetBytes('a');

您得到以下結果:

在此處輸入圖片說明

解決方案是只選擇不是0x00的字節:

bytes = bytes.Where(x => x != 0x00).ToArray();

string asciiString = Encoding.ASCII.GetString(bytes, 0, bytes.Length);
label1.Text = asciiString;

本示例基於GetBytes的char變體。 但這適用於此方法的所有其他重載。 它們都返回一個數組,該數組可以保存相應數據類型的最大值。 因此,如果值太小以至於陣列中的最后一個字節不被使用並最終變為0,則總是會發生這種情況!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM