Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字节数组转换为Int24_C#_Byte - Fatal编程技术网

C# 将字节数组转换为Int24

C# 将字节数组转换为Int24,c#,byte,C#,Byte,我正在用BinaryReader读取一个文件 我想在地址0x37E处提取数据,但它是int24。所以即使我读了3个字节,我也不能把它转换成int24 你有什么建议吗 我正在使用C#,正在处理STFS软件包的内容。为了将字节数组转换为int24,您需要知道数据的endianness。这意味着:11 22 33中的信息应表示0x112233或0x332211 根据此端点,您可以转换数据,例如 int24 result_bigendian = array[0] * 65536 + array[1] *

我正在用BinaryReader读取一个文件

我想在地址0x37E处提取数据,但它是int24。所以即使我读了3个字节,我也不能把它转换成int24

你有什么建议吗


我正在使用C#,正在处理STFS软件包的内容。

为了将字节数组转换为int24,您需要知道数据的endianness。这意味着:
11 22 33
中的信息应表示
0x112233
0x332211

根据此端点,您可以转换数据,例如

int24 result_bigendian = array[0] * 65536 + array[1] * 256 + array[2] // (1)

(分别为

如果您愿意,请注意(1)的区别

我不知道C#;可能有一种更容易达到目标的方法。

为了补充答案,在C中,您可以尝试以下方法:

public int ReadInt24(byte[] array, int pos)
{
    if(array == null || array.Length < 3)
       return -1; //some invalid value
    if (BitConverter.IsLittleEndian)
        return ((array[2]) + (array[1] * 256) + (array[0] * 65536));
    else
        return ((array[0]) + (array[1] * 256) + (array[2] * 65536));
}
public int ReadInt24(字节[]数组,int pos)
{
if(array==null | | array.Length<3)
return-1;//某个无效值
if(位转换器.IsLittleEndian)
返回((数组[2])+(数组[1]*256)+(数组[0]*65536));
其他的
返回((数组[0])+(数组[1]*256)+(数组[2]*65536));
}
属性将说明当前的Endianness

指示存储数据的字节顺序(“endianness”) 这是计算机体系结构


不久前,我已经为这个问题编写了一个扩展方法

public enum Endian : int {
    Little,
    Big
}

public static int ToInt32(this byte[] buffer, Endian endian = Endian.Little) {
    if (buffer.Length < 1 || buffer.Length > 4)
        throw new ArgumentException(" ... ");

    if (endian == Endian.Big)
        buffer.Reverse();

    int sum = 0;
    for (int i = buffer.Length - 1; i > -1; --i)
        sum += (buffer[i] << (i << 3));

    if ((buffer[buffer.Length - 1] & 0x80) == 0x80)
        sum |= (0xFFFFFF << (buffer.Length << 3));

    return sum;
}

public static unsafe void Reverse(this byte[] buffer) {
    fixed (byte* b = buffer) {
        byte* s, e;
        s = b;
        e = b + buffer.Length - 1;

        byte t;                
        while (s < e) {
            t = *s;
            *s = *e;
            *e = t;
            ++s;
            --e;
        }
    }
}
2.它能够将字节数组转换为两个字节顺序

byte[] x = { 0x12, 0x34, 0x56 };
int valueLittle = x.ToInt32(Endian.Little); // Return 5,649,426
int valueBig    = x.ToInt32(Endian.Big);    // Return 1,193,046
3.它负责符号位

byte[] x = { 0x00, 0x00, 0x80 };
x.ToInt32();           // Return -8,388,608
x.ToInt32(Endian.Big); // Return 128
我已经尽可能快地尝试了这些方法。做了一些基准测试,速度对我有好处。
希望此解决方案有助于并使生活更轻松。;)

对于签名int24,请使用:

int num = array[0] | array[1] << 8 | (sbyte)array[2] << 16;

int num=array[0]| array[1]对于带符号的int24,小尾端数使用:

int num = array[0] | array[1] << 8 | (sbyte)array[2] << 16;
int num = (sbyte)array[0] << 16 | array[1] << 8 | array[2];
int num = array[0] | array[1] << 8 | array[2] << 16;
int num = array[0] << 16 | array[1] << 8 | array[2];

int num=array[0]| array[1]这是什么语言?向我们展示您当前的代码(好吧,一个代码)。我建议你告诉我们你说的是哪种语言…啊,对不起,我有点困了:Dit是little endian,所以我使用下面的一种?没错。也许(3)
array[0]+array[1]*256+array[2]*65536
看起来更好……因为(2)和(3)在语义上是相同的,您可以自由选择。我知道endianness是什么:D@TCBurakAvcı,很好,你知道,但这个答案可能会对像我这样的未来访客有所帮助:)啊,无论如何,谢谢。我正在努力提高自己:D应该是int24而不是int32吗?如果你传递一个字节[3],它就可以了。字节[]x={0xff,0xff,0xff};x、 ToInt32();//返回-1如预期我没有时间计算,对不起。你能告诉我它是否可以转换为int24吗?
int num = (sbyte)array[0] << 16 | array[1] << 8 | array[2];
int num = array[0] | array[1] << 8 | array[2] << 16;
int num = array[0] << 16 | array[1] << 8 | array[2];
var num = array[0] | array[1] << 8 | array[2] << 16 | ... | (sbyte)array[n] << 8*n;
var num = array[n] | array[n-1] << 8 | array[n-2] << 16 | ... | (sbyte)array[0] << 8*n;
var num = (sbyte)array[0] << 8*n | array[1] << 8*(n-1) | ... | array[0];
var num = stream.ReadByte() | stream.ReadByte() << 8 | (sbyte)stream.ReadByte() << 16;