将十六进制数反转为字符串
reverse hex number into a string
我要转换unsigned long long
0xabcd1234
到这个字符串
3412cdab
*我们希望保留前导零,例如 0x1 将转换为该字符串“01000000”,0x123 将转换为“23010000”
现在我成功地编写了这样做的代码,但我想知道是否有更简单的方法
char* encode_long_long_hex(unsigned long long integer, char* out,
int len, size_t *out_len)
{
static char encode_hex_char_arr[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char* dst = out;
unsigned idx = count_long_long_digits(integer); //return number of digits
while (idx && dst < out + len)
{
idx -= 2;
*dst = encode_hex_char_arr[(integer & 0xF0) >> 4];
dst += sizeof(char);
*dst = encode_hex_char_arr[integer & 0x0F];
dst += sizeof(char);
integer >>= 8;
}
*out_len = (int) (dst - out);
return dst;
}
谢谢!
有一种更简单的方法利用 sprintf
为您完成从数字到字符的转换:
#include <stdio.h>
int main(void) {
unsigned x = 0xabcd1234;
char s[40];
sprintf(s, "%02x%02x%02x%02x",
x & 0xFF,
(x >> 8) & 0xFF,
(x >> 16) & 0xFF,
(x >> 24) & 0xFF
);
printf("%s\n", s);
// your code goes here
return 0;
}
这会将原始数字按字节“馈送”到 sprintf
,后者会将这些数字格式化为十六进制。 (注意,我在这里使用了 unsigned
类型,而不是 long long
,因为你的例子中的数字适合它 在我的平台上 。如果你需要更大的类型,你可以也采用这种方法)。
#include <stdio.h>
void toHexReverse(unsigned long long val, char *buff)
{
static const char hex[] = "0123456789ABCDEF";
while(val)
{
buff[1] = hex[val % 16];
val /= 16;
buff[0] = hex[val % 16];
val /= 16;
buff += 2;
}
*buff = 0;
}
int main(void)
{
char buff[20];
toHexReverse(0xabcd1234, buff);
printf("%s\n", buff);
}
我猜您问的正式问题是“如何将表示为十六进制的 int 从大端转换为小端”(反之亦然)
如果是这样,那么正式的答案将是“解析十六进制,转换字节序,格式回十六进制”,或者换句话说 format(convert(parse(input)))
,或者在 C:
#include <stdlib.h>
#include <byteswap.h>
#include <stdio.h>
char output[11];
sprintf(output, "0x%x", bswap_32(strtol(input, NULL, 0)));
// Or without "0x" in both input and output:
char output[9];
sprintf(output, "%x", bswap_32(strtol(input, NULL, 16)));
我要转换unsigned long long
0xabcd1234
到这个字符串
3412cdab
*我们希望保留前导零,例如 0x1 将转换为该字符串“01000000”,0x123 将转换为“23010000”
现在我成功地编写了这样做的代码,但我想知道是否有更简单的方法
char* encode_long_long_hex(unsigned long long integer, char* out,
int len, size_t *out_len)
{
static char encode_hex_char_arr[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
};
char* dst = out;
unsigned idx = count_long_long_digits(integer); //return number of digits
while (idx && dst < out + len)
{
idx -= 2;
*dst = encode_hex_char_arr[(integer & 0xF0) >> 4];
dst += sizeof(char);
*dst = encode_hex_char_arr[integer & 0x0F];
dst += sizeof(char);
integer >>= 8;
}
*out_len = (int) (dst - out);
return dst;
}
谢谢!
有一种更简单的方法利用 sprintf
为您完成从数字到字符的转换:
#include <stdio.h>
int main(void) {
unsigned x = 0xabcd1234;
char s[40];
sprintf(s, "%02x%02x%02x%02x",
x & 0xFF,
(x >> 8) & 0xFF,
(x >> 16) & 0xFF,
(x >> 24) & 0xFF
);
printf("%s\n", s);
// your code goes here
return 0;
}
这会将原始数字按字节“馈送”到 sprintf
,后者会将这些数字格式化为十六进制。 (注意,我在这里使用了 unsigned
类型,而不是 long long
,因为你的例子中的数字适合它 在我的平台上 。如果你需要更大的类型,你可以也采用这种方法)。
#include <stdio.h>
void toHexReverse(unsigned long long val, char *buff)
{
static const char hex[] = "0123456789ABCDEF";
while(val)
{
buff[1] = hex[val % 16];
val /= 16;
buff[0] = hex[val % 16];
val /= 16;
buff += 2;
}
*buff = 0;
}
int main(void)
{
char buff[20];
toHexReverse(0xabcd1234, buff);
printf("%s\n", buff);
}
我猜您问的正式问题是“如何将表示为十六进制的 int 从大端转换为小端”(反之亦然)
如果是这样,那么正式的答案将是“解析十六进制,转换字节序,格式回十六进制”,或者换句话说 format(convert(parse(input)))
,或者在 C:
#include <stdlib.h>
#include <byteswap.h>
#include <stdio.h>
char output[11];
sprintf(output, "0x%x", bswap_32(strtol(input, NULL, 0)));
// Or without "0x" in both input and output:
char output[9];
sprintf(output, "%x", bswap_32(strtol(input, NULL, 16)));