【问题标题】:Could anyone please explain me this function, I am not able to understand this谁能解释一下这个功能,我无法理解
【发布时间】:2020-08-03 20:51:20
【问题描述】:
   unsigned long fileSize = file.size();
   byte buf[4];
   buf[0] = (byte) fileSize & 0xFF;
   buf[1] = (byte) (fileSize >> 8) & 0xFF;
   buf[2] = (byte) (fileSize >> 16) & 0xFF;
   buf[3] = (byte) (fileSize >> 24) & 0xFF;  
   

谁能解释一下这段代码。假设一个文件的大小可以选择

【问题讨论】:

  • 还有什么不懂的?
  • 您对位移不熟悉吗?使用按位运算?用铸造?请更具体地说明您的问题。

标签: c++ c arduino


【解决方案1】:

假设您想将十进制数 8375 拆分为数字。你可以这样做:

unsigned     value = 8375;
unsigned     digit_0 =  value         % 10;  // Gives 5
unsigned     digit_1 = (value /   10) % 10;  // Gives 7
unsigned     digit_2 = (value /  100) % 10;  // Gives 3
unsigned     digit_3 = (value / 1000) % 10;  // Gives 8

嗯,您发布的代码就是这样做的。只有它将数字拆分为 octets,它们是 成对的十六进制位。 IE。每个八位字节都可以取 [0..255] 范围内的值。

并且发布的代码使用按位运算: (a >> 8)实际上是(a / 256),而(a & 0xFF)(a % 256)

【讨论】:

  • 使用unsigned 会更接近说明性代码。对于inta >> 8a/256 不同,当a < 0a & 0xFFa%256 不同。
【解决方案2】:

代码占用文件大小的低 4 个字节(unsigned long 可能是 4 或 8 个字节,具体取决于平台/编译器),并将这 4 个单独的字节存储到 buf 数组中的 little-endian byte order .

它取fileSize 的最低8 位并将它们存储到buf[0],然后取下一个最低8 位并将它们存储到buf[1],以此类推buf[2]buf[3]

【讨论】:

    【解决方案3】:

    程序将无符号长整数的四个字节存储到另一个字节数组中。语句buf[0] = (byte) fileSize & 0xFF; 执行位掩码,因此从无符号长整数中提取最后 8 位。为了进一步提取 8 位,我们将数字右移 8 位,然后再次执行位掩码等。

    【讨论】:

    • 先生如何知道执行该语句的次数
    • 我们可以使用表达式sizeof(unsigned long)来确定unsigned long使用的字节数。字节 buf[sizeof(unsigned long)]; for(int i = 0; i > (8 * i)) & 0xff;请注意,上面的代码假定byte 由8 位组成。如果我们想让它也通用,我们可以使用来自clmiitsCHAR_BIT 和\UCHAR_MAX`。 CHAR_BIT 定义了 char 类型中的位数,UCHAR_MAX 给出了 unsigned char 的最大值。
    【解决方案4】:

    这只是找到一个 4 字节整数的 4 个字节。从 2020 年开始,它以十六进制执行您要查找 [2,0,2,0] 的操作。

    它的方法是移动位并使用带有全 1 掩码的 AND。

    【讨论】:

    • /s 4 bits 的 4 字节整数?
    • 好吧,您可以使用 >> 运算符指定位数,但内存以字节为单位
    【解决方案5】:

    在 little endian 系统上它与:

    memcpy(buf, &fileSize, 4);
    

    union 
    {
       unsigned long filesize;
       unsigned char buff[4];
    }x = {.filesize = file.size());
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多