【问题标题】:C# DWORD and QWORD - signed and unsigned madnessC# DWORD 和 QWORD - 有符号和无符号的疯狂
【发布时间】:2015-08-24 00:27:51
【问题描述】:

我注意到DWordQWord 值写入注册表时应该是有符号整数,而不是无符号整数。如果值为 UInt64 或 UInt32,此代码将引发异常:

registryKey.SetValue(name, value);

根据 MSDN DWORD 是一个 32 位无符号整数(范围:0 到 4294967295 十进制)https://msdn.microsoft.com/en-us/library/cc230318.aspx

所以,要将新的 DWORD 值写入注册表,我需要将其转换为有符号整数,如下所示:

UInt32 unsignedValue = (UInt32)someValue;
Int32 signedValue = (Int32)unsignedValue;
registryKey.SetValue(name, signedValue);

将无符号值传递给 SetValue 方法将引发异常。 是我遗漏了什么还是我智障了?

【问题讨论】:

    标签: c# registry dword


    【解决方案1】:

    对于historical reasons,.NET API/库通常是“签名的”而不是“签名的 + 未签名的”。

    但是最后一个signed int和一个unsigned int都占用了相同的内存空间,对于负值没有做特殊处理。所以你可以按照你说的做:将无符号值转换为有符号,用SetValue写,然后如果你查看Regedit中的值,你会发现它写的是“无符号”。

    请注意,如果您的程序是在“已检查”模式下编译的,则更正确的代码是:

    uint unsignedValue = ... // Your original value
    
    int signedValue = unchecked((int)unsignedValue);
    registryKey.SetValue(name, signedValue);
    

    因为在 intuint 之间的“已检查”模式下,如果无法进行转换,可能会引发异常。

    请注意,here:

    SetValue 的这种重载将 64 位整数存储为字符串 (RegistryValueKind.String)。要将 64 位数字存储为 RegistryValueKind.QWord 值,请使用指定 RegistryValueKind 的 SetValue(String, Object, RegistryValueKind) 重载。

    显然,您必须对已签名-未签名进行相同的处理。

    【讨论】:

      【解决方案2】:

      来自RegistryKey.SetValue 页面的示例:

      // Numeric values that cannot be interpreted as DWord (int) values
      // are stored as strings.
      

      似乎存储的值是有符号整数或字符串。

      【讨论】:

        猜你喜欢
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-11
        • 2015-07-12
        • 2015-01-24
        • 2019-01-15
        • 2013-04-06
        • 2011-04-09
        相关资源
        最近更新 更多