0

我有一个n字节的存储空间(在我的情况下是QByteArrayQt,但我认为这个问题更普遍)。

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

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

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

但是,当我考虑如何正确处理大端值时,我有点困惑如何正确打包这些值。

例如,假设我有位存储0bXXXXXXXXXXXXXXXX并且我想将值存储0x0123在位 offset 4,占用 9 位:

在 little endian 中,我只是将结果0b100100011写入我的存储:0bXXX100100011XXXX

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

因此,这将导致0x47最终的存储布局为0bXXX001000111XXXX.

这是正确的方法吗?

提前致谢。

4

1 回答 1

1

在您的示例中,您希望传输(作为示例)仅具有 9 位的 2 字节数字(0x0123)。
该数字可以小端(0b00000001 后跟 0b00100011)或大端(0b00100011 后跟 0b00000001)传输。
但是由于您只能用 9 位来表示它,因此必须去掉前导零(对于正数)或前导零(对于负数)。这意味着,在您的示例中,要传输的数字是 0b100100011,即高值字节的余数是 0b1,低值字节是 0b00100011。
因此,正如您所说,小端表示是 0b100100011,而大端表示是 0b001000111。
PS:这是我个人的看法;不知道有没有官方的定义。

于 2019-11-14T16:57:43.910 回答