将字节转换为sbyte而不更改C#中的位

时间:2015-05-14 01:22:00

标签: c# casting unsigned signed

我想将一个字节转换为sbyte,而不更改任何位。

byte b = 0x84;
sbyte sb = unchecked((sbyte)b);
Console.WriteLine("0x" + Convert.ToString(b, 16));
Console.WriteLine("0x" + Convert.ToString(sb, 16));

结果将是:

0x84
0xff84

我理解结果意味着什么以及它为什么会发生。但是,我似乎无法找出我能做些什么来避免这种行为。如何复制字节的实际二进制值并将其放入sbyte?

2 个答案:

答案 0 :(得分:3)

该位在String yourString = "com.google.android.syncadapters.contacts"; String[] sArr = yourString.split("\\."); String output = sArr[sArr.length-1]; b之间根本没有变化。此行为来自Convert.ToString()。只有sb的重载才会占用Convert.ToString()和基数。最接近的匹配是Convert.ToString Method (Int16, Int32)。因此sbyte符号扩展为16位。

答案 1 :(得分:0)

使用ToString通常会产生不太令人惊讶的结果,并且不会发生意外转换(例如sbyte - > short,如shf301' s所述{{3 }})。

byte b = 0x84;
sbyte sb = unchecked((sbyte)b);
Console.WriteLine("0x" + b.ToString("x"));
Console.WriteLine("0x" + sb.ToString("x"));

或者直接使用格式:

String.Format("0x{0:x}",((unchecked ((sbyte)0x84))))
相关问题