我有这个变量
unsigned long long latitude = 29.47667;
当我将此值转换为此类数据时
ar[7] = (uint8_t)((latitude >> 56) & 0xFF);
ar[6] = (uint8_t)((latitude >> 48) & 0xFF);
ar[5] = (uint8_t)((latitude >> 40) & 0xFF);
ar[4] = (uint8_t)((latitude >> 32) & 0xFF);
ar[3] = (uint8_t)((latitude >> 24) & 0xFF);
ar[2] = (uint8_t)((latitude >> 16) & 0xFF);
ar[1] = (uint8_t)((latitude >> 8) & 0xFF);
ar[0] = (uint8_t)(latitude & 0xFF);
然后使用tcp socket将其发送到服务器。当我发送时,我以十六进制打印值,然后我0x1d
全部为零。
如何在将unsigned long long转换为int时将确切的值发送到服务器。
答案 0 :(得分:6)
unsigned long long latitude = 29.47667
没有多大意义,unsigned long long
是整数类型。因此变量只获得截断的整数29
。
这就是为什么你只得到0x1d
,这只是十六进制的29
。
答案 1 :(得分:4)
逐字节读取双值:
double val = 29.47667;
double *ptr = &val;
uint8_t bytes[8];
register int i;
for(i = 0; i < 8; ++i)
{
bytes[i] = *(((uint8_t*)ptr) + i);
printf("%hhu", bytes[i]);
}
不要将unsigned long long
类型用于十进制值
另一种方法(如果不修改来源):
double val = 29.47667;
double *ptr = &val;
uint8_t *cptr = (uint8_t*)ptr;
现在直接使用*(cptr + i)来访问/发送字节 i的值。
答案 2 :(得分:2)
将double转换为hex,然后将hex转换为double。
使用double
覆盖64位整数。这假设double是8字节。如果double
不同,可以轻松覆盖其他整数。
通过tcp套接字发送整数,并根据需要重新构建。
// 29.47667
403D7A070B8CFBFC
2.94766699999999986e+01
#include <stdio.h>
#include <float.h>
#include <inttypes.h>
uint64_t MakeHex(double d) {
union {
double d;
uint64_t u;
} x;
x.d = d;
return x.u;
}
double MakeD(uint64_t u) {
union {
double d;
uint64_t u;
} x;
x.u = u;
return x.d;
}
int main() {
uint64_t u = MakeHex(29.47667);
printf("%0" PRIX64 "\n", u);
double d = MakeD(u);
printf("%.*le\n", DBL_DIG+2, d);
return 0;
}
答案 3 :(得分:-3)
您可以通过将其包含在任何头文件中来调用此函数
void dec_hex(long int num) // Function Definition
{
long int rem[50],i=0,length=0;
while(num>0)
{
rem[i]=num%16;
num=num/16;
i++;
length++;
}
printf("Hexadecimal number : ");
for(i=length-1;i>=0;i--)
{
switch(rem[i])
{
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
default :
printf("%ld",rem[i]);
}
}
}