![](/img/trans.png)
[英].NET Interop: How to get returned string (not null terminated) from unmanaged DLL in C#
[英]How to get a null terminated string from a C# string?
我認為聰明的方法就是簡單地做到這一點。
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.