[英]NUL characters from Marshal.Copy in C#
我定義了以下方法:
internal string GetInformation(string recordInformation)
{
int bufferSize = GetBufferSize(recordInformation);
string outputRecord;
IntPtr output = Marshal.AllocHGlobal(bufferSize);
try
{
_returnCode = UnmanagedMethod(recordInformation, output, recordInformation.Length);
byte[] outputData = new byte[bufferSize];
Marshal.Copy(output, outputData, 0, bufferSize);
outputRecord = ASCIIEncoding.ASCII.GetString(outputData, 0, bufferSize);
}
finally
{
Marshal.FreeHGlobal(output);
}
return outputRecord;
}
在此方法中,將提供的字符串(recordInformation)傳遞給用C編寫的方法(UnmanagedMethod)。 根據有關該方法的文檔,bufferSize的設置正確; 但是,Marshal.Copy會創建一個大小為recordInformation.Length的數組。 當我將ray分配給outputRecord變量時,字符串的內容是bufferSize的長度; 但是,有許多NUL(字符0)填充字符串的其余部分,直到命中recordInformation.Length字段為止。 如果將UnmanagedMethod參數列表中的最后一個參數更改為bufferSize,則輸出字符串將變為NUL字符。
我是在做封送處理錯誤,還是從字節數組創建了字符串后刪除NUL字符有辦法嗎?
謝謝
我認為您的示例沒有任何問題。
您可能要注意,.NET字符串可以包含NUL / NULL字符-但實際上,字符只是具有值0('\\ 0'或'\\ x00')。
您可以通過替換或遍歷字符串來清除字符,並將所有內容保留在第一個NUL之前。 您很可能需要后者,因為這在C語言中以零結尾的字符串中很常見。
這是一個簡單的示例(控制台),它說明了兩種情況下都會發生的情況。
string sTest1 = "abc\0\0def";
string sTest2 = sTest1.Replace("\0", "");
Console.WriteLine(sTest2);
int iLocation = sTest1.IndexOf('\0');
string sTest3 = "";
if (iLocation >= 0)
{
sTest3 = sTest1.Substring(0, iLocation);
}
else
{
sTest3 = sTest1;
}
Console.WriteLine(sTest3);
Console.ReadLine();
前者將導致abcdef ,而后者將導致abc 。
還要注意,后一種方法將要求您首先檢查NUL字符,以防萬一字符串包含整個緩沖區位置並且根本沒有NUL字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.