1

我有一个奇怪的问题。我有一个带有标签的表单,用于在程序中的某些点输出文本,而不是控制台输出。给定以下代码:

result = SetupDiGetDeviceRegistryProperty(deviceInfoSet, ref tBuff, 
                                          (uint)SPDRP.DEVICEDESC,
                                          out RegType, ptrBuf, 
                                          buffersize, out RequiredSize); 

if (!result)
{
    errorMessage = new Win32Exception(Marshal.GetLastWin32Error()).Message;
    statusLabel.Text += "\nSetupDiGetDeviceRegistryProperty failed because "
                        + errorMessage.ToString();
}
else
{
    statusLabel.Text += "\nPtr buffer length is: " + ptrBuf.Length.ToString();

    sw.WriteLine(tCode.GetString(ptrBuf) );

    sw.WriteLine("\n");
    // This is the only encoding that will give any legible output.
    // Others only show the first character "U"
    string tmp = tCode.GetString(ptrBuf) + "\n"; 

    statusLabel.Text += "\nDevice is: " + tmp + ".\n";                    
}

我只得到标签上的一个硬件 ID 输出。这段代码在我循环的末尾。起初,这让我觉得我的循环有点悬,但是当我决定将输出直接输出到一个文件时,我几乎得到了我想要的和循环外的输出。谁能告诉我这里发生了什么?我想要的只是从 []byte ( ptrBuf ) 中获取表示硬件 ID 的字符串。请有人解释一下这里发生了什么?我的工作环境是 MSVstudio 2008 express。在 Windows 7 中。

谢谢

4

4 回答 4

3

不幸的是,你没有展示什么tCode是。

查看API 调用的文档,它看起来应该用 REG_SZ 填充。我怀疑那是Unicode,即

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);

应该转换它。

但是,如果您期望多个值,我想知道它是否是 - 分隔的'\0'字符串:尝试在 Win32 控件中输出它确实会在第一个'\0'.

试试这个:

string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);
                                  .Replace('\0', ' ');

那应该(如果我猜对了)用空格分隔值。

于 2009-05-14T20:45:50.043 回答
2

您需要指定编码:

// C# to convert a byte array to a string.
byte [] dBytes = ...
string str;
System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding();
str = enc.GetString(dBytes);
于 2009-05-14T20:40:48.620 回答
1

对不起,我应该说。UnicodeEncoding tCode = new UnicodeEncoding(); 并且感谢 skeet,我不知道关于 Win32 控件的小信息。我会努力纠正这一点。我并没有暗中尝试将字节转换为字符(或字符串)。以后我会努力讲得更详细。

谢谢大家的回复。

于 2009-05-14T22:47:17.677 回答
0

您不能将字节隐式转换为字符串。您必须为转换选择一种编码方法(可能是 Unicode 或 ASCII)。一个字节存储一个可以表示一个字符(或一些其他数据)的数值,但本质上并不意味着什么。它在哲学上相当于将整数转换为字符串。您可以决定对值进行直接转换,或者您可以从该值中获得一些含义(即使用 ASCII 表:13 = TAB)。

您列出的函数返回的值很可能返回了一个表示某个字符串值的字节数组,但是您需要找到相关的编码方法将其转换为可用的字符串。

希望有帮助!

埃里克

于 2009-05-14T20:47:31.583 回答