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
.
%d
在 printf
循环到 %u
,在两个地方。
此外,已清理:
- 删除了初始
b=iolpt(1);
中的 b=
,因为它未被使用。
- 移动了
b
内部循环的定义以限制其范围。
- 将
n
的定义移至 for
以限制其范围。
- 在评论中使用适当的大写字母和标点符号以提高清晰度和美感。
我想知道我是否可以使用 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
.%d
在printf
循环到%u
,在两个地方。
此外,已清理:
- 删除了初始
b=iolpt(1);
中的b=
,因为它未被使用。 - 移动了
b
内部循环的定义以限制其范围。 - 将
n
的定义移至for
以限制其范围。 - 在评论中使用适当的大写字母和标点符号以提高清晰度和美感。