Dot-Net

從 System.Text.Encoding.Unicode.GetString 獲取空終止字元串

  • January 2, 2022

我有一個從外部實體接收到的字節數組。它是一個固定大小。字節包含一個 unicode 字元串,用 0 值填充緩衝區的其餘部分:

所以字節可能是:

H \0 E \0 L \0 L \0 \0 \0 \0 \0 \0 ... etc 

我正在獲取該緩衝區並將其轉換為如下字元串:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
String cmd = System.Text.Encoding.Unicode.GetString(buffer);

我得到的是一個看起來像這樣的字元串:

"HELLO\0\0\0\0\0\0\0\0..."

如何告訴 GetString 在第一個 Unicode null 處終止字元串(即,我只返回“HELLO”)?

感謝您的任何意見。

如果你確定其餘的都是 \0,這會起作用:

cmd = cmd.TrimEnd('\0');

否則,如果您只想在第一個 null 之前獲取所有內容:

int index = cmd.IndexOf('\0');
if (index >= 0)
  cmd = cmd.Remove(index);

請注意,這Unicode.GetString將處理雙 \0。你應該只尋找一個\0。

對於 UTF8/ASCII 編碼,您可以通過查找緩衝區中第一次出現的空終止符(使用System.Array.IndexOf)來實現此目的,而無需重新處理字元串。然後,您可以使用重載System.Text.Encoding.Unicode.GetString方法創建一個字元串,直到給定緩衝區大小。

下面的範例還適用於不包含空字節的緩衝區:

byte[] buffer = new byte[buffSize];
m_dataStream.Read(buffer, 0, buffSize);
var size = System.Array.IndexOf(buffer, (byte)0);
String cmd = System.Text.Encoding.Unicode.GetString(buffer, 0, size < 0 ? buffSize : size);

對於 UTF16,您可以使用帶有 for 循環的類似方法(尋找第一對空字元 … 例如if (buffer[i] == (byte)0 && buffer[i] == buffer[i+1]).

如果創建臨時字元串無關緊要,那麼接受的答案是最好的解決方案。

引用自:https://stackoverflow.com/questions/864246