我目前正在编写一个程序,它将读取windows系统注册表的一部分,但是这些键的一些值是System.Byte[]类型的,当我尝试解码这些值时,我可以生成一个具有一些可读字符的字符串,但大多数字符串是jiberish。我尝试了几种编码类型,但似乎都不能产生正确的结果。我只是想知道是否有什么已知的方法可以解决这个问题。这是我的代码
public void getMRU()
{
String mru = @"Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU";
RegistryKey rk = Registry.CurrentUser.OpenSubKey(mru);
foreach (string skName in rk.GetSubKeyNames())
{
RegistryKey sk = rk.OpenSubKey(skName);
System.Text.Encoding enc = System.Text.Encoding.UTF8;
string myString = enc.GetString((Byte[])sk.GetValue("0"));
Console.WriteLine(myString)
}
}发布于 2010-01-04 05:15:31
正确的解码和解释因键而异。对于二进制值,没有强制的格式,应用程序可以自由地存储他们想要的任何字节。你必须知道你读了什么才能解释它。如果关键内容是文档化的,那么您可以应用文档规范来解码内容。如果是未记录的,那么您就没有必要阅读它。
发布于 2010-12-01 05:07:01
也许这不再是一个问题,但为了帮助其他可能遇到此问题的人,请考虑以下几点:
项目标识符列表的指针只存在于Windows NT 6.x (Vista,Win7)中,实际上是在桌面上启动的,而不是C:...(我相信这是因为引入了“库”)。因此,需要特殊处理才能从PIDL中提取文件路径。
下面的方法GetPathFromPIDL()将获取注册表项的(byte[]) byteCode并将其转换为特定于平台的IntPtr。然后我们获取IntPtr (假设它是一个PIDL)并调用P/Invoke方法SHGetPathFromIDListW(),该方法将PIDL的字符串表示放入我们的StringBuilder中。
private string GetPathFromPIDL(byte[] byteCode)
{
//MAX_PATH = 260
StringBuilder builder = new StringBuilder(260);
IntPtr ptr = IntPtr.Zero;
GCHandle h0 = GCHandle.Alloc(byteCode, GCHandleType.Pinned);
try
{
ptr = h0.AddrOfPinnedObject();
}
finally
{
h0.Free();
}
SHGetPathFromIDListW(ptr, builder);
return builder.ToString();
}SHGetPathFromIDListW()的原型
[DllImport("shell32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SHGetPathFromIDListW(IntPtr pidl, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszPath);发布于 2010-01-04 05:14:41
不能保证存储在注册表中的任何值的字节都一定是编码的字符串。如果它们是字符串,那么注册表值的类型就是字符串。
如果它是一个字节值,那么它通常意味着它是对应用程序自定义的某种数据结构的编码,所以您必须弄清楚拥有您正在读取的键的应用程序的格式。
https://stackoverflow.com/questions/1996318
复制相似问题