32 位作为 C 中的十六进制数,具有简单的函数调用

32-bits as hex number in C with simple function call

我想知道我是否可以使用 printf 将来自微控制器的 32 位传入二进制数据打印为十六进制数。我已经将这些位收集到一个大整数变量中,我正在尝试 printf 中的“%x”选项,但我似乎得到的只是 8 位值,尽管我无法判断这是 printf 还是我的微控制器的限制实际上正在返回该值。

这是我从微控制器接收数据的代码:

 printf("Receiving...\n");
 unsigned int n=0,b=0;
 unsigned long lnum=0;
 b=iolpt(1); //call to tell micro we want to read 32 bits
 for (n=0;n<32;n++){
     b=iolpt(1); //read bit one at a time
     printf("Bit %d of 32 = %d\n",n,b);
     lnum<<1; //shift bits in our big number left by 1 position
     lnum+=b; //and add new value
 }
 printf("\n Data returned: %x\n",lnum); //always returns 8-bits

iolpt() 函数始终returns 从微控制器读取的位和返回的值是 0 或 1。

我认为使用 %x 作为 32 位十六进制数是否可以接受,或者我是否应该尝试使用类似“%lx”而不是“%x”的方法来表示长十六进制,即使它无处记录或者是 printf 32 位十六进制的错误函数?如果它的函数错误,那么是否有我可以使用的函数,或者我是否被迫先将我的长数字分解为四个 8 位数字?

类似的东西对你有用吗?

printf("Receiving...\n");
 unsigned int n=0,b=0;
 unsigned long lnum=0;
 b=iolpt(1); //call to tell micro we want to read 32 bits
 for (n=0;n<32;n++){
     b=iolpt(1); //read bit one at a time
     printf("Bit %d of 32 = %d\n",n,b);
     lnum<<1; //shift bits in our big number left by 1 position
     lnum+=b; //and add new value
 }
 printf("\n Data returned: %#010lx\n",lnum); //now returns 32-bit
printf("Receiving...\n");

iolpt(1); // Tell micro we want to read 32 bits.
    /*  Is this correct?  It looks pretty simple to be
        initiating a read.  It is the same as the calls
        below, iolpt(1), so what makes it different?
        Just because it is first?
    */

unsigned long lnum = 0;
for (unsigned n = 0; n < 32; n++)
{
    unsigned b = iolpt(1); // Read bits one at a time.
    printf("Bit %u of 32 = %u.\n", n, b);
    lnum <<= 1; // Shift bits in our big number left by 1 position.
        // Note this was changed to "lnum <<= 1" from "lnum << 1".
    lnum += b; // And add new value.
}

printf("\n Data returned: %08lx\n", lnum);
    /*  Use:
            0 to request leading zeros (instead of the default spaces).
            8 to request a field width of 8.
            l to specify long.
            x to specify unsigned and hexadecimal.
    */

固定:

  • lnum<<1;lnum <<= 1;.
  • %x 最后 printf%08lx.
  • %dprintf 循环到 %u,在两个地方。

此外,已清理:

  • 删除了初始 b=iolpt(1); 中的 b=,因为它未被使用。
  • 移动了 b 内部循环的定义以限制其范围。
  • n 的定义移至 for 以限制其范围。
  • 在评论中使用适当的大写字母和标点符号以提高清晰度和美感。