我的应用程序中有一个包含此数据的8字节数组:
00000133339e36a2
这个数据代表了一个很长的(在平台上,数据被写入,在Mac上,这将是一个很长的长),其值为
1319420966562
在实际应用中,这是一组半随机数据,因此数字总是不同的。因此,我需要将字节数组转换为可打印的long long。
我已经尝试将数据直接投入很长时间了,但我想出了
1305392
我应该看到上面的数字。
对于那些在C字节操作方面比我更有经验的人,我如何正确地将字节数组转换为long long?
编辑:奇怪的是,所有解决方案都保持输出相同的数字:866006690。这是数据的最后四个字节的十进制等效值。
答案 0 :(得分:3)
这似乎是联盟有用的(罕见)情况之一:
union number
{
char charNum[16];
long long longNum;
};
答案 1 :(得分:3)
union le_long_long_array_u
{
uint8_t byte[8];
uint64_t longlong;
} le_long_long_array;
复制(或仅使用)le_long_long_array.byte[]
数组;
回读le_long_long_array.longlong
例如:
fill_array(&le_long_long_array.byte[0]);
return le_long_long_array.longlong;
富勒示例:
#include <stdint.h>
#include <stdio.h>
union le_long_long_array_u
{
uint8_t byte[8];
uint64_t longlong;
} le_long_long_array;
static uint8_t hex2int (char c)
{
return (c >= '0' && c <= '9')
? (uint8_t )(c - '0')
: ((c >= 'a' && c <= 'f')
? (uint8_t )(c - 'a')
: ((c >= 'A' && c <= 'F')
? (uint8_t )(c - 'A')
: 0));
}
int main (int argc, char **argv)
{
if (argc == 2)
{
int i;
for (i = 0; i <= 7; i++)
{
char *str = argv[1];
if (str[2*i] == '\0' || str[2*i+1] == '\0')
{
printf("Got short string.\n");
return 1;
}
le_long_long_array.byte[i] = (hex2int(str[2*i]) << 4) + hex2int(str[2*i+1]);
}
printf("Got %lld\n", le_long_long_array.longlong);
}
else
{
printf("Got %d args wanted 1.\n", argc - 1);
return 1;
}
return 0;
}
产地:
e e$ gcc -c un.c
e e$ gcc -o un un.o
e e$ ./un 0100000000000000
Got 1
e e$ ./un 0101000000000000
Got 257
e e$ ./un a23639333301000000
Got 1319414347266
e e$
正如您对小端数据所期望的那样。
答案 2 :(得分:2)
根据您所希望的字节顺序,这样的事情可行:
int i;
char inArray[8] = { 0x00,0x00,0x01,0x33,0x33,0x9e,0x36,0xa2 };
long long outLong = 0;
for(i=0; i<8; i++)
outLong |= ( (long long)inArray[i]) << (i*8) );
答案 3 :(得分:1)
long long num = 0;
for(int i = 0; i < 8; i++) {
num = (num << 8) | byte_array[i];
}
假设他们存储了big-endian。
答案 4 :(得分:1)
好问题!而且很棒的答案!投入一分钱:
// Getting stuff "in"
unsigned long long ll1 = 1319420966562;
unsigned char * c = reinterpret_cast<unsigned char *>( &ll1 );
// Getting stuff "out"
unsigned long long ll2;
memcpy( &ll2, c, 8 );
ll2
现在等于ll1
。
我必须管理,但是,我更喜欢union
示例。 :)
答案 5 :(得分:0)
也许是指针符号?
*((uint32_t*)Array)
或者如果可能的话
{{1}}