簡體   English   中英

C#DWORD和QWORD - 簽名和未簽名的瘋狂

[英]C# DWORD and QWORD - signed and unsigned madness

我注意到寫入注冊表時的DWordQWord值應該是有符號整數,而不是無符號。 如果值為UInt64或UInt32,則此代碼將引發異常:

registryKey.SetValue(name, value);

根據MSDN, DWORD是一個32位無符號整數(范圍:0到4294967295十進制) https://msdn.microsoft.com/en-us/library/cc230318.aspx

因此,要將新的DWORD值寫入Registry,我需要將其轉換為有符號整數,如下所示:

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

將無符號值傳遞給SetValue方法將引發異常。 我錯過了什么,或者我只是被弱智?

由於歷史原因 ,.NET API /庫通常是“已簽名”而不是“已簽名+未簽名”。

但最后, signed intunsigned int都占用相同的內存空間,並且沒有對負值進行特殊處理。 所以你可以按照你說的做:將無符號值轉換為signed,用SetValue寫,然后如果你看Regedit中的值,你會看到它被寫成“unsigned”。

請注意,如果您的程序是在“已檢查”模式下編譯的,則更正確的代碼是:

uint unsignedValue = ... // Your original value

int signedValue = unchecked((int)unsignedValue);
registryKey.SetValue(name, signedValue);

因為在“已檢查”模式下,如果無法進行轉換,則intuint之間的轉換會拋出異常。

注意,寫在這里

SetValue的這個重載將64位整數存儲為字符串(RegistryValueKind.String)。 要將64位數字存儲為RegistryValueKind.QWord值,請使用指定RegistryValueKind的SetValue(String,Object,RegistryValueKind)重載。

顯然,你必須對signed-unsigned做同樣的處理。

RegistryKey.SetValue頁面'示例:

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

似乎存儲的值是簽名的int或字符串。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM