我有一个非常简单的sprintf
问题。
int STATUS = 0;
char test[100];
int n = sprintf( test,"%04x", STATUS );
printf ("[%s] is a %d char long string\n",test,n);
for(i=0 ; i<4 ; i++) {
printf("%02x", test[i]);
}
printf("\n\n");
此代码的输出为30303030
,这不是我打算输出的。基本上,
我想将00000000
作为输出,因此整数值应占用输出中的4个字节
以其实际价值。谁能告诉我我做错了什么?
答案 0 :(得分:4)
0x30是'0'的ASCII代码,你混合了char和int表示。
答案 1 :(得分:2)
您似乎将此转换为十六进制。对于字符“0”,30是十六进制。 将第一个sprintf修改为:
int n = sprintf( test,"%4d", STATUS );
或只是
printf("%08x", STATUS);
答案 2 :(得分:1)
电话:
printf("%02x", test[i]);
使用2个十六进制数字将每个字符打印为整数。 30是十六进制48,它是'0'的ascii值。改为
printf("%02c", test[i]);
虽然我;我不确定在一般情况下这会是你想要的。
答案 3 :(得分:0)
printf期望在使用说明符x打印任何内容时获取一个数字作为参数。你正在传递一个角色,所以它打印出角色的ascii值。尝试更改
printf("%02x", test[i]);
到
printf("%02x", test[i] - 0x30);
答案 4 :(得分:0)
打印30而不是00,因为您打印的字符为'0'的整数值,其中ASCII为0x30,或十进制为48。
如果您想查看用于定义整数的原始字节,可以尝试这样的事情。
typedef union {
int integerValue;
uint8_t bytes[sizeof(int)];
} MyIntegerOrBytes;
void foo(void) {
MyIntegerOrBytes value;
value.integerValue = 100;
for(int i = 0; i < sizeof(int); i += 1) {
printf("byte[%d] = %d\n", i, value.bytes[i]);
}
}
答案 5 :(得分:0)
如果您要问的是确定您的STATUS变量是4字节宽,那么请包含inttypes.h(C99标头)并将其声明为:
uint32_t STATUS = 0;
如果你还想确定它是big-endian,你必须将它声明为一个字节数组:
unsigned char STATUS[4] = { 0x00, 0x00, 0x00, 0x01 } /* STATUS = 1, 32bit BE */
非常确定这是便携式C中最好的。