簡體   English   中英

如何從C#字符串中獲取空終止字符串?

[英]How to get a null terminated string from a C# string?

  • 我正在與需要空終止字符串的服務器通信
  • 我怎樣才能在C#中巧妙地做到這一點?

我認為聰明的方法就是簡單地做到這一點。

string str = "An example string" + char.MinValue; // Add null terminator.

然后將其轉換為字節以發送到服務器。

byte[] buffer = ASCIIEncoding.ASCII.GetBytes(str);

當然,您使用的編碼取決於服務器所期望的編碼。

我假設你正在實現某種二進制協議,如果字符串是空終止的。 你在使用BinaryWriter嗎?

默認的BinaryWriter將字符串寫為長度前綴。 您可以更改該行為:

class MyBinaryWriter : BinaryWriter
{
    private Encoding _encoding = Encoding.Default;

    public override void Write(string value)
    {
        byte[] buffer = _encoding.GetBytes(value);
        Write(buffer);
        Write((byte)0);
    }
}

然后你可以像這樣寫任何字符串:

using (MyBinaryWriter writer = new MyBinaryWriter(myStream))
{
    writer.Write("Some string");
}

您可能需要根據需要調整_encoding位。

您當然可以根據您可能需要傳輸的其他數據類型的特定需求來擴展該類,從而使您的實際協議實現保持良好和清潔。 您可能還需要自己的(非常相似的) BinaryReader

字符串已經空終止。 盡管字符串本身不包含空字符,但空字符始終跟在內存中的字符串之后。

但是,.NET中的字符串是unicode,因此它們在內存中存儲為UTF-16 / UCS-2,服務器可能需要不同的編碼,通常是8位編碼。 然后你必須將字符串編碼為字節數組並在結尾放置一個零字節:

byte[] data = Encoding.Default.GetBytes(theString);
byte[] zdata = new byte[data.Length + 1];
data.CopyTo(zdata, 0);

(創建時,zdata數組全部用零填充,因此您不必將額外字節實際設置為零。)

您在字符串的末尾添加一個空字符。 .NET字符串可以包含空字符。

暫無
暫無

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

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