将字节数组转换为 Int24

Bur*_*vcı 3 c# byte

我正在使用 BinaryReader 读取文件。

我想在地址 0x37E 处提取数据,但它是 int24。所以即使我读取了3个字节,我也无法将其转换为int24。

您有什么建议吗?

我正在使用 C# 并正在研究 STFS 包的东西。

小智 5

对于有符号 int24、小端使用:

int num = array[0] | array[1] << 8 | (sbyte)array[2] << 16;
Run Code Online (Sandbox Code Playgroud)

对于有符号 int24、大端使用:

int num = (sbyte)array[0] << 16 | array[1] << 8 | array[2];
Run Code Online (Sandbox Code Playgroud)

对于unsigned int24、little endian使用:

int num = array[0] | array[1] << 8 | array[2] << 16;
Run Code Online (Sandbox Code Playgroud)

对于unsigned int24、big endian使用:

int num = array[0] << 16 | array[1] << 8 | array[2];
Run Code Online (Sandbox Code Playgroud)

请注意,对于任何有符号 int(n字节的小端字节序),只需列出所有字节,使用“|”连接它们,逐个移动它们,然后将 (sbyte) 添加到最后一个字节以使其有符号:

var num = array[0] | array[1] << 8 | array[2] << 16 | ... | (sbyte)array[n] << 8*n;
Run Code Online (Sandbox Code Playgroud)

对于big endian,只需反转移位顺序:

var num = array[n] | array[n-1] << 8 | array[n-2] << 16 | ... | (sbyte)array[0] << 8*n;
Run Code Online (Sandbox Code Playgroud)

或者,当然,也可以:

var num = (sbyte)array[0] << 8*n | array[1] << 8*(n-1) | ... | array[0];
Run Code Online (Sandbox Code Playgroud)

您必须确保(sbyte)具有最高位字节(如果是小端字节序,则为最后一个字节;如果是大端字节序,则为第一个字节),以便 C# 创建 int 的符号。

当然,对于unsigned int,只需删除(sbyte)即可。


最后一件事..数组可以是byte[]int[]。所以你可以这样做:

var num = stream.ReadByte() | stream.ReadByte() << 8 | (sbyte)stream.ReadByte() << 16;
Run Code Online (Sandbox Code Playgroud)

其中streamSystem.IO.Stream