如何将十六进制字符串转换为带符号整数?

9

我得到了一个需要转换为有符号8位整数的十六进制字符串。目前,我正在使用Int16 / Int32进行转换,这显然不会为8位整数给出负值。如果我在十六进制中获得值255,如何将其转换为十进制中的-1?我认为我想使用sbyte,但我不确定如何正确地将该值放入其中。


2
http://msdn.microsoft.com/en-us/library/bb311038.aspx - James Black
1
相关且有很好的答案,https://dev59.com/Sm855IYBdhLWcg3wjlGL - barlop
3个回答

10

您可以使用Convert.ToSByte方法。

例如:

string x = "aa";
sbyte v = Convert.ToSByte(x, 16);
// result: v = 0xAA or -86

你也可以使用sbyte.Parse

例如:

string y = "bb";
sbyte w = sbyte.Parse(y, System.Globalization.NumberStyles.HexNumber);
// result: w = 0xBB or -69

针对你关于 Int16 类型的高位字节和低位字节的问题:

string signed_short = "feff";

// Truncate 16 bit value down to 8 bit
sbyte b1 = (sbyte)Convert.ToInt16(signed_short, 16);
sbyte b2 = (sbyte)short.Parse(signed_short, System.Globalization.NumberStyles.HexNumber);
// result: b1 = 0xFF or -1
// result: b2 = 0xFF or -1

// Use upper 8 bit of 16 bit
sbyte b3 = (sbyte)(Convert.ToInt16(signed_short, 16) >> 8);
sbyte b4 = (sbyte)(short.Parse(signed_short, System.Globalization.NumberStyles.HexNumber) >> 8);
// result: b3 = 0xFE or -2
// result: b4 = 0xFE or -2

2
您需要执行一个unchecked转换,就像这样:
sbyte negativeOne = unchecked((sbyte)255);

我猜是因为 OP 要求将“字符串转换为有符号整数”。无论如何,你的回答对我很有帮助。谢谢! :) - Anton Kedrov

0
我的解决方案是将16位整数的前8位取出并存储在sbyte中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接