【发布时间】:2019-03-05 18:10:04
【问题描述】:
我有一个 C 函数可以将十进制转换为十六进制字符串 hexConversion:
int hexConversion(int num){
char hex_buffer[9];
unsigned int mask = 4026531840;
for(int i = 0; i < 9; i++){
int temp = mask & num;
if(temp < 10){
hex_buffer[i] = temp + '0';
}
else if(temp == 10){
hex_buffer[i] = 'A';
}
else if(temp == 11){
hex_buffer[i] = 'B';
}
else if(temp == 12){
hex_buffer[i] = 'C';
}
else if(temp == 13){
hex_buffer[i] = 'D';
}
else if(temp == 14){
hex_buffer[i] = 'E';
}
else if(temp == 15){
hex_buffer[i] = 'F';
}
mask >>= 4;
}
hex_buffer[8] = '\0';
for(int i = 0; i < sizeof(hex_buffer); i++){
printf("%c", hex_buffer[i]);
}
}
带驱动代码:
int main(){
hexConversion(2);
hexConversion(255);
hexConversion(-1);
hexConversion(INT_MAX);
hexConversion(INT_MIN);
hexConversion(0xDEADBEEF);
}
我的输出是:
00000002 0000000F 0000000F 0000000F 00000000 0000000F
每个输出的最后一个值都是正确的,但最后一个值之前的所有值都没有计算。我相信这是因为我的 temp = mask & num 没有产生不是 0-15 的值。我的问题是,我如何一次只考虑 4 位,以便我的所有 temp 值都在这个范围内?
【问题讨论】:
-
你应该转移
num而不是mask。mask应该掩盖下半字节。请注意,您最好使用无符号类型。 -
最简单的事情可能是从右到左生成字符串。检查
num & 0x0f并转移号码 -
这里不涉及小数。您将二进制值编码为十六进制字符串。为了使十进制有意义,您需要转换十进制字符串,或者使用在内部将数字表示为十进制的计算机。
-
请注意,循环将写入
hex_buffer[8],稍后将被hex_buffer[8] = '\0';覆盖 -
@WeatherVane 这个错误当然不是
hex_buffer[8] = '\0'而是转9次(还有其他几个错误)
标签: c function binary hex output