0

我定义了以下方法:

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 的数组。当我将光线分配给 outputRecord 变量时,字符串的内容就是 bufferSize 的长度;但是,有许多 NUL (Char 0) 来填充字符串的其余部分,直到它到达 recordInformation.Length 字段。如果我将 UnmanagedMethod 参数列表中的最后一个参数更改为 bufferSize,则输出字符串将变为 NUL 字符。

我是在做错误的封送处理,还是在从字节数组创建字符串后有办法删除 NUL 字符?

谢谢

4

1 回答 1

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 字符。

于 2009-07-07T17:40:00.083 回答