-2

我有这个变量

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 套接字将其发送到服务器。当我发送时,我以十六进制打印值,然后我得到0x1d所有零。

如何在将 unsigned long long 转换为 int 时将确切值发送到服务器。

4

4 回答 4

6

unsigned long long latitude = 29.47667没有多大意义,unsigned long long是整数类型。所以变量只得到截断的整数29

这就是为什么你得到 only 0x1d,它只是29十六进制的。

于 2013-08-20T05:31:56.307 回答
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 处的值。

于 2013-08-20T07:15:38.880 回答
2

将双精度转换为十六进制,然后将十六进制转换为双精度。

用 .覆盖一个 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;
}
于 2013-08-24T01:45:10.863 回答
-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]);
    }
  }
}
于 2013-08-20T05:58:58.240 回答