我有一个奇怪的问题。 我有一个带有Label的表单,用于在程序中的某些点输出文本而不是控制台输出。 给出以下代码:
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输出。这段代码就在我的循环结束时。在第一,这让我觉得我的循环有些悬挂,但当我决定将输出直接输出到文件时,我几乎得到了我想要的东西和循环外的输出。 谁能告诉我这里发生了什么? 我想要的是从[]字节( ptrBuf )获取表示硬件ID的字符串。 有人可以解释一下这里发生了什么吗? 我的工作环境是MSVstudio 2008 express。在Windows 7中。
由于
答案 0 :(得分:3)
不幸的是,你没有展示tCode
是什么。
查看docs for the API call看起来它应该填充REG_SZ。我怀疑这是Unicode,即
string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);
应该转换它。
但是,如果您期望多个值,我想知道它是否是'\0'
- 分隔的字符串:尝试在Win32控件中输出它确实会在第一个'\0'
停止。
试试这个:
string property = Encoding.Unicode.GetString(ptrBuf, 0, RequiredSize);
.Replace('\0', ' ');
那应该(如果我猜对了)空间分隔值。
答案 1 :(得分: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);
答案 2 :(得分:1)
UnicodeEncoding tCode = new UnicodeEncoding();
并且感谢双向飞碟,我不知道关于Win32控件的那些小信息。我会努力纠正这个问题。
我并没有暗中尝试将字节转换为字符(或字符串)。我将努力在将来更加详细。
感谢大家的回复。
答案 3 :(得分:0)
您无法将字节隐式转换为字符串。您必须为转换选择编码方法(可能是Unicode或ASCII)。字节存储可以表示字符(或一些其他数据)的数值,但本质上并不意味着什么。它是将整数转换为字符串的哲学等价物。您可以决定直接转换值,也可以从值中获得一些含义(即使用ASCII表:13 = TAB)。
您列出的函数返回的值很可能返回一个表示某个字符串值的字节数组,但是您可以找到相关的编码方法将其转换为可用的字符串。
希望有所帮助!
埃里克