Dot-Net
從 System.Text.Encoding.Unicode.GetString 獲取空終止字元串
我有一個從外部實體接收到的字節數組。它是一個固定大小。字節包含一個 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]).如果創建臨時字元串無關緊要,那麼接受的答案是最好的解決方案。