我正在使用 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)
其中stream是System.IO.Stream。
| 归档时间: |
|
| 查看次数: |
3138 次 |
| 最近记录: |