首页 文章

将long long number转换为c中的char数组

提问于
浏览
0

我有两个长长的数字a和b,每个都有8个字节 . 我也有一个16字节的数组arr . 我想用数字表示数组的第一个8字节,用b表示数组的最后8字节 .

我想做这样的事情:

#include <stdio.h>

int main() {
    long long a = 123456;
    long long b = 654321;
    unsigned char arr[16];

    memcpy(arr, a, 8);
    memcpy(arr + 8, b, 8);

    return 0;
}

编译器告诉我

不兼容的整数到指针转换将'long long'传递给'const void *'类型的参数[-Wint-conversion]

我的问题是如何将long long转换为可以放入我的数组的字节?

1 回答

  • 1

    你必须使用:

    void convertToCharArray(unsigned char *arr, long long a)
    {
        int i = 0;
    
        for (i = 0; i < 8; ++i)
        {
            arr[i] = (unsigned char)((((unsigned long long) a) >> (56 - (8*i))) & 0xFFu);
        }
    }
    
    int main()
    {
        long long a = 123456;
        long long b = 654321;
        unsigned char arr[16];
    
        convertToCharArray(&arr[0], a);
        convertToCharArray(&arr[8], b);
    
        printf("a   => %llx\n", a);
        printf("b   => %llx\n", b);
    
        printf("arr =>");
        for(i = 0; i < 16; ++i)
        {
            printf("%x", arr[i]);
        }
    }
    

    结果:

    a => 1e240 b => 9fbf1 arr => 000001e240000009fbf1

    示例here

    convertToCharArray 提取 a 的每个字节并将其放在数组的不同单元格中 . 最重要的字节在索引0中 . 它与此相同:

    // Save MSB in 0
    arr[0] = (unsigned char)((((unsigned long long) a) >> 56) & 0xFFu);
    // Save second MSB in 1
    arr[1] = (unsigned char)((((unsigned long long) a) >> 48) & 0xFFu);
    ...
    // Save seventh MSB in 6
    arr[6] = (unsigned char)((((unsigned long long) a) >> 8) & 0xFFu);
    // Save LSB in 7
    arr[7] = (unsigned char)(((unsigned long long) a) & 0xFFu);
    

    operator >> 是"bitwise right shift"运算符:它在左操作数上运行 n 位的移位(其中 n 是右操作数) . 所以 a >> 8 从8位向右移动a =>它将第二个字节放在第一个字节的位置 . 之后,我使用operator & 这是"bitwise and"运算符来实现一个掩码来激活只需要的字节 .

    Don't use memcpy to do that (便携性和安全性问题)


    只是为了回答你的问题, memcpy 希望有2个第一个参数的指针,所以你必须传递 &a&b . & 检索变量的地址 .

相关问题