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

时间:2016-05-26 13:17:32

标签: c type-conversion

我有两个长长的数字a和b,每个长8个字节。我也有一个16字节的数组arr。我希望将数组的第一个8字节与a匹配,并将数组的最后8个字节与b匹配。

我想做这样的事情:

#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 long&#39;         参数类型&#39; const void *&#39; [-Wint转换]

我的问题是如何将long long转换为适合我的数组的字节?

2 个答案:

答案 0 :(得分: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 =&gt; 1e240
    b =&gt; 9fbf1
    arr =&gt; 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);

运算符>>是“按位右移”运算符:它在左操作数上运行n位的移位(其中n是右操作数)。因此a >> 8从8位向右移动a =&gt;它将第二个字节放在第一个字节的位置。之后,我使用运算符&这是“按位和”运算符来实现一个掩码来激活只需要的字节。

请勿使用memcpy来执行此操作(可移植性和安全性问题)

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

答案 1 :(得分:0)

尝试一下。 可能不是您要找的人,但可以完成工作...

void longToStr(long lNo){
    char str[14];
    int numbers[14], n=0;
    while (lNo > 0) {
        numbers[n] = lNo % 10;
        lNo = lNo / 10;
        n++;
    }
    int i = 0;
    str[n] = '\0';
    n--;
    while (n >= 0) {
        str[i] = numbers[n] + '0';
        n--;
        i++;
    }
    cout<<str;
}

void main(){
    longToStr(992940523);
}