c从缓冲区读取4字节小尾数的代码

Yogesh Devi

我遇到了这段现有的C代码。我正在努力理解它。

我应该将在缓冲区中传递的4字节无符号值(小端格式)读入类型为“ long”的变量中。

这段代码在64位字长,小端x86机器上运行-其中sizeof(long)是8个字节。我的猜测是该代码还打算在32位x86机器上运行-因此,为了存储来自四字节输入数据的值,使用了long类型的变量而不是int。

我有一些疑问,并在代码中添加了注释以表达我的理解或不理解的内容:-)

请在这种情况下回答以下问题

void read_Value_From_Four_Byte_Buff( char*input)
{
    /* use long so on 32 bit machine, can still accommodate 4 bytes */ 
    long intValueOfInput;  

    /* Bitwise and of input buffer's byte 0 with 0xFF gives MSB or LSB ?*/
    /* This code seems to assume that assignment will store in rightmost byte - is that true on a x86 machine ?*/
    intValueOfInput =  0xFF & input[0];

    /*left shift byte-1 eight times, bitwise "or" places in 2nd byte frm right*/
    intValueOfInput |= ((0xFF & input[1]) << 8);

    /* similar left shift in mult. of 8 and bitwise "or" for next two bytes */
    intValueOfInput |= ((0xFF & input[2]) << 16);
    intValueOfInput |= ((0xFF & input[3]) << 24);

}

我的问题

1)输入缓冲区应为“小端”。但是从代码看来,这里的假设是:字节0 = MSB,字节1,字节2,字节3 = LSB。我这样想是因为代码从字节0开始读取字节,而随后的字节(从1开始)则在左移后放置在目标变量中。是这样吗,还是我弄错了?

2)我觉得这是一种复杂的工作方式-是否有更简单的替代方法将值从4字节缓冲区复制到长变量中?

3)假设“此代码将在64位计算机上运行”会否影响我可以轻松实现此目的?我的意思是要保持单词大小不可知(是否现在不知道单词大小-尽管不确定)吗?

谢谢您的启发:-)

戴维·格雷森
  1. 您使用的代码确实会将输入缓冲区视为小端。看一下它如何占用缓冲区的第一个字节,然后将其分配给变量,而不进行任何移位。如果第一个字节增加1,则结果的值增加1,因此它是最低有效字节(LSB)。左移使字节更有效,而不是更少。左移8通常等于乘以256。
  2. 我认为除非使用外部函数,对运行此代码的计算机进行假设或调用未定义的行为,否则您不会比这简单得多。在大多数情况下,只需编写就可以了,uint32_t x = *(uint32_t *)input;但这是假设您的计算机为低端字节序,并且我认为根据C标准,这可能是未定义的行为。
  3. 不,在64位计算机上运行不是问题。我建议使用uint32_tint32_t这样的类型以便更轻松地推断您的代码是否适用于不同的体系结构。您只需要包括stdint.hC99标头即可使用这些类型。

此函数最后一行的右侧可能会显示不确定的行为,具体取决于输入中的数据:

((0xFF & input[3]) << 24)

问题在于,这(0xFF & input[3])将是一个有符号的int(由于整数提升)。int可能会是32位的,到目前为止,你正在把它的左边所得到的值可能不是一个表示的intC标准说,这是不确定的行为,你应该尽量避免,因为它使编译器许可证才能为所欲为,你将无法预测结果。

一种解决方案是将它从一个转换int到一个uint32_t移位它,使用流延之前。

最后,将变量intValueOfInput写入但从未使用过。您不应该将其退还或存储在某个地方吗?

考虑到所有这些,我将这样重写函数:

uint32_t read_value_from_four_byte_buff(char * input)
{
    uint32_t x;
    x = 0xFF & input[0];
    x |= (0xFF & input[1]) << 8;
    x |= (0xFF & input[2]) << 16;
    x |= (uint32_t)(0xFF & input[3]) << 24;
    return x;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

c从缓冲区读取4字节小尾数的代码

来自分类Dev

JS从缓冲区读取字节

来自分类Dev

无法在307200字节的TensorFlowLite缓冲区和270000字节的Java缓冲区之间转换

来自分类Dev

Python从缓冲区读取数据

来自分类Dev

从缓冲区读取Python 2.6

来自分类Dev

节点红色。从缓冲区中提取字节

来自分类Dev

ORU-10027:缓冲区溢出,限制为100000字节

来自分类Dev

NodeJS缓冲区-读取小端缓冲区

来自分类Dev

在套接字编程中从缓冲区接收数据

来自分类Dev

ruby IO.gets是否从缓冲区读取?

来自分类Dev

从缓冲区读取 csv 文件得到了 EmptyDataError?

来自分类Dev

NodeJS缓冲区从字节读取位

来自分类Dev

如何在一个4字节长的char之间解码在两个缓冲区中分割的utf8编码的字符串?

来自分类Dev

Android-TFLite OD-无法从4320000字节的Java缓冲区复制到307200字节的TensorFlowLite张量(normalized_input_image_tensor)

来自分类Dev

谷歌大查询 - 从缓冲区刷新数据(缓冲区上的 4 天数据)

来自分类Dev

read()不读取套接字缓冲区上的剩余字节

来自分类Dev

为什么缓冲区应该在64字节边界上对齐以获得最佳性能?

来自分类Dev

无法分配268435456字节的托管内存缓冲区。可用内存量可能不足

来自分类Dev

ReadAsync从缓冲区获取数据

来自分类Dev

C#.NET套接字tcp begin / endreceive客户端:endreceive读取所有字节,但是在beginreceive中,缓冲区大小自行更改

来自分类Dev

从缓冲区中删除多个字节的规范方法

来自分类Dev

如何将4字节IEEE(小尾数)float二进制表示形式转换为float

来自分类Dev

C-函数read(文件,缓冲区,要读取的字节)破坏字符串

来自分类Dev

Android:从缓冲区读取,直到收到特定的字符或字符串

来自分类Dev

返回从缓冲区和函数读取的字符串而没有动态分配?

来自分类Dev

如何从缓冲区读取并存储为int和float变量

来自分类Dev

从缓冲区读取器输入字符串时的 Java 数字异常

来自分类Dev

C服务器套接字的读取功能写入脏缓冲区

来自分类Dev

使用套接字时重用读取缓冲区

Related 相关文章

  1. 1

    c从缓冲区读取4字节小尾数的代码

  2. 2

    JS从缓冲区读取字节

  3. 3

    无法在307200字节的TensorFlowLite缓冲区和270000字节的Java缓冲区之间转换

  4. 4

    Python从缓冲区读取数据

  5. 5

    从缓冲区读取Python 2.6

  6. 6

    节点红色。从缓冲区中提取字节

  7. 7

    ORU-10027:缓冲区溢出,限制为100000字节

  8. 8

    NodeJS缓冲区-读取小端缓冲区

  9. 9

    在套接字编程中从缓冲区接收数据

  10. 10

    ruby IO.gets是否从缓冲区读取?

  11. 11

    从缓冲区读取 csv 文件得到了 EmptyDataError?

  12. 12

    NodeJS缓冲区从字节读取位

  13. 13

    如何在一个4字节长的char之间解码在两个缓冲区中分割的utf8编码的字符串?

  14. 14

    Android-TFLite OD-无法从4320000字节的Java缓冲区复制到307200字节的TensorFlowLite张量(normalized_input_image_tensor)

  15. 15

    谷歌大查询 - 从缓冲区刷新数据(缓冲区上的 4 天数据)

  16. 16

    read()不读取套接字缓冲区上的剩余字节

  17. 17

    为什么缓冲区应该在64字节边界上对齐以获得最佳性能?

  18. 18

    无法分配268435456字节的托管内存缓冲区。可用内存量可能不足

  19. 19

    ReadAsync从缓冲区获取数据

  20. 20

    C#.NET套接字tcp begin / endreceive客户端:endreceive读取所有字节,但是在beginreceive中,缓冲区大小自行更改

  21. 21

    从缓冲区中删除多个字节的规范方法

  22. 22

    如何将4字节IEEE(小尾数)float二进制表示形式转换为float

  23. 23

    C-函数read(文件,缓冲区,要读取的字节)破坏字符串

  24. 24

    Android:从缓冲区读取,直到收到特定的字符或字符串

  25. 25

    返回从缓冲区和函数读取的字符串而没有动态分配?

  26. 26

    如何从缓冲区读取并存储为int和float变量

  27. 27

    从缓冲区读取器输入字符串时的 Java 数字异常

  28. 28

    C服务器套接字的读取功能写入脏缓冲区

  29. 29

    使用套接字时重用读取缓冲区

热门标签

归档