我正在尝试在C#中将3个字节转换为有符号整数(Big-endian)。
我尝试使用BitConverter.ToInt32
方法,但我的问题是什么值应该有lats字节。
有人可以建议我怎样才能以不同的方式做到这一点?
我还需要将5(或6或7)个字节转换为有符号长,有什么一般规则怎么做?
提前感谢您的帮助。
答案 0 :(得分:9)
作为最后的手段,你总是可以转移+添加自己:
byte b1, b2, b3;
int r = b1 << 16 | b2 << 8 | b3;
只需交换b1 / b2 / b3,直到获得所需的结果。
第二个想法,这绝不会产生负面价值 当msb> = 0x80?
时,您想要什么结果?第2部分,强力标志扩展:
private static int Bytes2Int(byte b1, byte b2, byte b3)
{
int r = 0;
byte b0 = 0xff;
if ((b1 & 0x80) != 0) r |= b0 << 24;
r |= b1 << 16;
r |= b2 << 8;
r |= b3;
return r;
}
我用以下方法对此进行了测试:
byte[] bytes = BitConverter.GetBytes(p);
int r = Bytes2Int(bytes[2], bytes[1], bytes[0]);
Console.WriteLine("{0} == {1}", p, r);
有几个p
。
答案 1 :(得分:4)
如果未设置为正数,则最后一个值应为0,对于负数,则为256。
要知道你应该传递什么,你可以尝试转换它:
var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);
答案 2 :(得分:0)
要在此处添加现有答案,如果数组的大小小于Bitconverter.ToInt32()
(4)字节,那么ArgumentException
会抛出sizseof(int)
,这有点麻烦;
目标数组不够长,无法复制集合中的所有项目。检查数组索引和长度。
给定一个小于sizeof(int)
(4)字节的数组,你可以像这样补偿左/右填充;
右键
结果为Int32
个正数
int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length);
sourceBytes = padded;
左键
结果为负Int32
个数字,假设字节索引sourceBytes.Length - 1
处的值为非零值。
int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, intByteSize - sourceBytes.Length, sourceBytes.Length);
sourceBytes = padded;
填充后,您可以安全地拨打int myValue = BitConverter.ToInt32(sourceBytes, 0);
。