在C#中将3个字节转换为带符号整数
本文关键字:带符号 整数 转换 字节 中将 3个 | 更新日期: 2023-09-27 18:14:10
我正在尝试在C#中将3个字节转换为有符号整数(Big endian(。
我尝试过使用BitConverter.ToInt32
方法,但我的问题是什么值应该有lats字节。
有人能建议我如何用不同的方式做吗?
我还需要将5(或6或7(个字节转换为带符号的长字节,有什么通用规则吗?
提前感谢您的帮助。
作为最后的手段,您可以随时转移并添加自己:
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);
对于几个CCD_ 2。
如果没有为正数设置最后一个值,则该值应为0,为负数设置256。
要知道你应该传递什么,你可以尝试用另一种方式转换:
var bytes = BitConverter.GetBytes(i);
int x = BitConverter.ToInt32(bytes, 0);
要添加到这里的现有答案中,如果数组大小小于sizseof(int)
(4(字节,那么Bitconverter.ToInt32()
将抛出一个ArgumentException
,这有点棘手;
目标数组不够长,无法复制集合中的所有项。检查数组索引和长度。
给定一个大小小于sizeof(int)
(4(字节的数组,您可以像这样补偿左/右填充;
右垫
导致Int32
数字为正
int intByteSize = sizeof(int);
byte[] padded = new byte[intByteSize];
Array.Copy(sourceBytes, 0, padded, 0, sourceBytes.Length);
sourceBytes = padded;
左焊盘
假定字节索引sourceBytes.Length - 1
处的值为非零值,则会产生负的Int32
数。
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);
。