2009-07-07 60 views
0

我已經定義了下列方法:NUL字符在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(Char 0)來填充字符串的其餘部分,直到它到達recordInformation.Length字段。如果我將UnmanagedMethod參數列表中的最後一個參數更改爲bufferSize,則輸出字符串將變成除NUL字符之外的任何內容。

我在做的編組錯誤或有沒有一種方法後,從字節數組中創建字符串以刪除NUL字符?

謝謝

+0

你使用什麼非託管方法?如果沒有能夠閱讀原生規格,很難說元帥的最佳方式是什麼。 它是一種API方法,還是自定義的東西? – 2009-07-07 17:31:19

+0

非託管方法是來自第三方API的方法。 API文檔全部在C中,方法簽名(在C中)是'int UnmanagedMethod(char * inputstring,char * outputstring,int inputlength)'。除了字符串末尾的NUL字符之外,正在正確創建outputRecord字符串。 – JamesEggers 2009-07-07 17:35:27

回答

1

我看不出你的例子有什麼問題。

您可能會想要注意,.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字符。

相關問題