将2个字节转换为有符号整数

3

有没有办法将2个字节转换成有符号整数?我知道我们可以按照以下方式将一个字节转换为有符号整数

byte B1= 0xFF;
int r = Convert.ToSbyte((sbyte)B1);

那对于包含2个字节的有符号整数呢?例如,-260在16进制下表示为0xFC、0xFE。


3
如果这是一个通信协议,你首先需要知道架构的字节序。此外,在.NET中,2字节的有符号整数是“short”(或“Int16”),而不是“int”(它是“Int32”)。 - vgru
3个回答

10

假设第一个字节是最高有效位(MSB):

byte b1 = 0xff;
byte b2 = 0xff;
var test = BitConverter.ToInt16(new byte[] { b1, b2 }, 0);
否则:
byte b1 = 0xff;
byte b2 = 0xff;
var test = BitConverter.ToInt16(new byte[] { b2, b1 }, 0);

编辑:“已签署”


OP可能想要一个有符号的Int16 - vgru

7

如果只有一个字节,只需 赋值

byte B1 = 0xFF;
int r = B1;

如果是两个字节 - 添加移位并赋值:
byte B1 = 0xFE;
byte B2 = 0xFC;

int r = (B1 << 8) | B2;

如果需要使用Int16,则进行类型转换:

// -260
short s = unchecked((short) ((B1 << 8) | B2));

OP可能想要一个有符号的Int16 - vgru
好老的二进制运算符,肯定比任何转换器类更有效 :) - Gusman

1

那会转换为无符号整数。 - prattom
@prattom BitConverter.ToInt32:从字节数组中指定位置的四个字节转换为32位有符号整数并返回。 - default
2
抱歉,这不是无符号整数,而是BitConverter返回正整数而非负整数,例如0xFC,如果我使用BitConverter类,则返回的值为65276,而实际上应该是-260。 - prattom
ToInt32(array<Byte>^, Int32)函数从字节数组中指定位置的四个字节转换为32位有符号整数。建议您使用此函数。 - Thomas
2
@prattom 这是因为你使用了ToInt32并且只发送了两个字节,一个Int32的负位在dword的最高位,所以两个字节没有负数,使用ToInt16()。 - Gusman

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