从 32 位块中读取 n 位

发布于 2024-10-28 08:54:50 字数 315 浏览 6 评论 0原文

我正在尝试读取由旧版 Fortan 应用程序编写的二进制文件。

它将数据写入 32 位块。其中一些 32 位 chnuk 包含多个数据。

例如1: 9位将包含范围从(0-511)的位置偏移值 22位将包含范围从(1-2097151)的数据记录值

eg2: 17 位将包含范围从 (1-131071) 的年份值 4 位将包含范围从 (1-12) 的月份值 5 位将包含范围从 (1-31) 的日期值 5 位将包含范围从 (1-24) 的小时值

我想知道如何读取数据,我可以获取整数存储的 32 位值,但是我应该执行哪些操作来提取该 4 字节值的不同部分。

I am trying to read a binary file written by an legacy Fortan application.

It writes data into chunks of 32bit. Some of these 32bit chnuk contains mutiple data.

e.g 1 :
9 bit will contain position offset value ranging from (0-511)
22 bit will contain data record value ranging from (1-2097151)

e.g.2 :
17 bit will contain year value ranging from (1-131071)
4 bit will contain month value ranging from (1-12)
5 bit will contain day value ranging from (1-31)
5 bit will contain hour value ranging from (1-24)

I am wondering how to read the data, I can get the 32bit value store in integer, but what operations should I perform to extract the different parts of that 4byte value.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

吃→可爱长大的 2024-11-04 08:54:50

一般来说,类似以下内容(不一定是有效的 C#)应该有效:

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> dataOffset) & mask;
}

请注意,数据偏移量被视为从字段中最右边的位开始,值向左增长。要使用从左侧开始向右增长的偏移量,请执行以下操作:

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> (32 - (dataOffset - dataLength))) & mask;
}

Generally speaking, something like the following (which is not necessarily valid C#) should work:

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> dataOffset) & mask;
}

Note that the data offset is treated as beginning from the rightmost bit in the field, with values growing to the left. To use offsets that begin from the left and grow to the right, do something like:

int readValue(int sourceBits, int dataOffset, int dataLength) {
    unsigned int mask = pow(2, dataLength) - 1;
    return (sourceBits >> (32 - (dataOffset - dataLength))) & mask;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文