是否有一个标准,如何在big endian中打包非字节对齐的位?

问题描述 投票:0回答:1

我的存储量为[[n个字节(在我的情况下是Qt中的QByteArray,但我认为这个问题更笼统)。

我有一个在该存储器上运行的类,并在该位字段的任何位位置存储不同类型的数据类型。它以大端或小端顺序执行此操作,具体取决于参数。

到目前为止,没有出现任何问题。我通过这样构造的位字段通过can总线交换数据。不,我正在实现以任意长度(以位为单位)存储值(只要它们适合)。

对于小端值,这很容易,因为我可以简单地修剪前导零,当涉及负数时也可以修剪前导零。

但是,当我考虑如何针对大字节序值执行正确的方法时,我有点困惑如何正确打包值。

例如,假设我有位存储0bXXXXXXXXXXXXXXXX,并且我想将值0x0123存储在位偏移4处,占据9位:

在小尾数法中,我只需将结果0b100100011写到我的存储中:0bXXX100100011XXXX

在大字节序中,我最终得到的值为0x2301。是打包我修剪第一个非零字节(从右到右)中的零以适合9位的值的正确方法吗?

因此,这将导致0x47的值最终具有0bXXX001000111XXXX的存储布局。

这是正确的方法吗?

提前感谢。

bit-manipulation bitwise-operators endianness bit-fields bit-packing
1个回答
0
投票
在您的示例中,您只想(例如)传输一个9比特的2字节数字(0x0123)。该数字可以作为小字节序(0b00000001,然后是0b00100011)或作为大字节序(0b00100011,然后是0b00000001)进行传输。但是,由于您只能用9位表示它,因此必须丢弃前导零(对于正数)或前导零(对于负数)。这意味着,在您的示例中要传输的数字为0b100100011,即高值字节的其余部分为0b1,而低值字节为0b00100011。因此,正如您所说,小尾数表示为0b100100011,大尾数表示为0b001000111。PS:这是我个人的看法;我不知道是否有正式定义。
© www.soinside.com 2019 - 2024. All rights reserved.