Как преобразовать шестнадцатеричную строку в целое число со знаком?

Я получаю шестнадцатеричную строку, которую нужно преобразовать в 8-битное целое число со знаком. В настоящее время я конвертирую, используя Int16/Int32, что, очевидно, не даст мне отрицательного значения для 8-битного целого числа. Если я получу значение 255 в шестнадцатеричном формате, как мне преобразовать его в -1 в десятичном формате? Я предполагаю, что хочу использовать sbyte, но я не уверен, как правильно получить это значение.


person alexD    schedule 14.09.2010    source источник
comment
msdn.microsoft.com/en-us/library/bb311038.aspx   -  person James Black    schedule 14.09.2010
comment
связанные и с отличными ответами, stackoverflow.com/questions/4275440/   -  person barlop    schedule 17.11.2017


Ответы (3)


Вы можете использовать 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
person SwDevMan81    schedule 14.09.2010

Вам нужно выполнить приведение unchecked, например:

sbyte negativeOne = unchecked((sbyte)255);
person SLaks    schedule 14.09.2010
comment
Я думаю, это потому, что OP просил преобразовать STRING в целое число со знаком. В любом случае, ваш ответ был полезен для меня. Благодарю вас! :) - person Anton Kedrov; 29.12.2014

Мое решение состояло в том, чтобы сначала взять первые 8 бит 16-битного целого числа и сохранить их в сбайте.

person alexD    schedule 09.10.2010