【问题标题】:Converting 2 bytes to signed int将 2 个字节转换为有符号整数
【发布时间】:2016-06-03 14:03:49
【问题描述】:

他们有什么方法可以将 2 个字节转换为有符号整数吗?我知道我们可以通过以下方式将字节转换为有符号整数

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

但是有符号整数的 2 个字节呢?比如-260就是0xFC,0xFE

【问题讨论】:

  • 如果这是一个通信协议,你需要先知道架构的字节序。此外,2 字节有符号整数是 short(或 Int16),而不是 .NET 中的 int(即 Int32)。

标签: c# int


【解决方案1】:

假设第一个字节是 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
【解决方案2】:

如果是一个字节,就赋值

byte B1 = 0xFF;
int r = B1;

如果是两个字节 - 添加 shift 并赋值:

byte B1 = 0xFE;
byte B2 = 0xFC;

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

如果需要Int16,然后强制转换:

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

【讨论】:

  • OP 可能想要一个签名的Int16
  • 好的旧二元运算符,肯定比任何转换器类最有效:)
【解决方案3】:

看看BitConverter class 及其 ToInt32() 方法。

【讨论】:

  • 这将转换为无符号整数
  • @prattom BitConverter.ToInt32:返回从字节数组中指定位置的四个字节转换而来的 32 位有符号整数。
  • 抱歉不是无符号整数,但 Bitconverter 返回正整数而不是负整数,例如。如果我使用 BitConverter 类,0xFC,0xFE 将返回为 65276,而它应该是 -260
  • ToInt32(array^, Int32) 返回从字节数组中指定位置的四个字节转换而来的 32 位有符号整数。你应该使用这个。
  • @prattom 那是因为你使用了 ToInt32 并且只发送了两个字节,一个 int32 在 dword 的最高有效位有它的负位,所以两个字节没有负数,使用 ToInt16()跨度>
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 2012-10-30
  • 2013-06-08
  • 2023-01-29
  • 2011-12-27
  • 2011-04-21
  • 2018-12-01
  • 2022-01-15
相关资源
最近更新 更多