2013-10-12 106 views
1

我想爲一個字符串,包含十六進制值成等值的C#轉換十六進制數符號短

短簽署例如轉換:

-1相當於十六進制數爲0xFFFF(在兩個字節)

我想要做的倒數,即我要到0xFFFF轉換爲-1

我使用

string x = "FF"; 
short y = Convert.ToInt16(x,16); 

但輸出y是255而不是-1,我需要相應的有符號數

任何人都可以幫助我嗎? 謝謝

+0

你能顯示輸出255的代碼? – Steve

+2

我剛剛在linqpad中運行Convert.ToInt16(「0xFFFF」,16),並得到-1 –

+1

@PaulMcCowat相同,這就是要求輸出代碼 – Steve

回答

1

當你的輸入是「FF」時,你有一個字節的十六進制字符串表示形式。
如果您嘗試將其分配給一個較短的(兩個字節),則不會考慮將最後一位應用於轉換後的數字,因此您會得到255值。

相反,「FFFF」的字符串表示代表最後一位設置爲1的兩個字節,因此如果分配給像Int16這樣的帶符號類型,則結果爲負,而如果分配給像ushort這樣的無符號類型,結果爲65535-

string number = "0xFFFF"; 
short n = Convert.ToInt16(number, 16); 
ushort u = Convert.ToUInt16(number, 16); 

Console.WriteLine(n); 
Console.WriteLine(u); 

number = "0xFF"; 
byte b = Convert.ToByte(number, 16); 
short x = Convert.ToInt16(number, 16); 
ushort z = Convert.ToUInt16(number, 16); 

Console.WriteLine(n); 
Console.WriteLine(x); 
Console.WriteLine(z); 

輸出:

-1 
65535 
-1 
255 
255 
2

您正在尋找轉換籤名字節的字符串表示形式,而不是簡短。

您應該改用Convert.ToSByte(string)

一個簡單的單元測試來證明

[Test] 
public void MyTest() 
{ 
    short myValue = Convert.ToSByte("FF", 16); 
    Assert.AreEqual(-1, myValue); 
} 
+0

哦,我剛剛意識到,謝謝 – Rehab11

0

我不理解爲什麼那個數的值變爲1。我知道byte值將是溢出。

byte number = 255; 
number += 2; 
Console.WriteLine(number); 

輸出是:1

+0

如果你有一個新的問題,請問點擊[Ask Question](https://stackoverflow.com/questions/ask)按鈕。如果有助於提供上下文,請包含此問題的鏈接。 - [來自評論](/ review/low-quality-posts/19052666) – xskxzr

相關問題