簡體   English   中英

來自元帥的NUL字符。用C#復制

[英]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.

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