我有两个长长的数字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转换为适合我的数组的字节?
答案 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);
}