首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将c#注册表System.Byte[]设置为字符串

将c#注册表System.Byte[]设置为字符串
EN

Stack Overflow用户
提问于 2010-01-04 05:07:35
回答 4查看 2.9K关注 0票数 2

我目前正在编写一个程序,它将读取windows系统注册表的一部分,但是这些键的一些值是System.Byte[]类型的,当我尝试解码这些值时,我可以生成一个具有一些可读字符的字符串,但大多数字符串是jiberish。我尝试了几种编码类型,但似乎都不能产生正确的结果。我只是想知道是否有什么已知的方法可以解决这个问题。这是我的代码

代码语言:javascript
复制
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)
   }
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-04 05:15:31

正确的解码和解释因键而异。对于二进制值,没有强制的格式,应用程序可以自由地存储他们想要的任何字节。你必须知道你读了什么才能解释它。如果关键内容是文档化的,那么您可以应用文档规范来解码内容。如果是未记录的,那么您就没有必要阅读它。

票数 4
EN

Stack Overflow用户

发布于 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中。

代码语言:javascript
复制
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()的原型

代码语言:javascript
复制
[DllImport("shell32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool SHGetPathFromIDListW(IntPtr pidl, [MarshalAs(UnmanagedType.LPTStr)] StringBuilder pszPath);
票数 3
EN

Stack Overflow用户

发布于 2010-01-04 05:14:41

不能保证存储在注册表中的任何值的字节都一定是编码的字符串。如果它们是字符串,那么注册表值的类型就是字符串。

如果它是一个字节值,那么它通常意味着它是对应用程序自定义的某种数据结构的编码,所以您必须弄清楚拥有您正在读取的键的应用程序的格式。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1996318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档