将十六进制数反转为字符串

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,因为你的例子中的数字适合它 在我的平台上 。如果你需要更大的类型,你可以也采用这种方法)。

Demo

#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);
}

https://godbolt.org/z/37zvM75MK

我猜您问的正式问题是“如何将表示为十六进制的 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)));