-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 ソケットを使用してサーバーに送信します。送信時に値を 16 進数で出力すると、0x1d残りはすべてゼロになります。

unsigned long long を int に変換しながら正確な値をサーバーに送信する方法。

4

4 に答える 4

6

unsigned long long latitude = 29.47667あまり意味がありませんunsigned long longが、整数型です。したがって、変数は切り捨てられた整数のみを取得します29

そのため、16 進数の のみ0x1dが得られます。29

于 2013-08-20T05:31:56.307 に答える
4

double 値をバイト単位で読み取ります。

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 long10 進数値に型を使用しないでください

別の方法(ソースが変更されない場合):

double val = 29.47667;
double *ptr = &val;
uint8_t *cptr = (uint8_t*)ptr;

*(cptr + i) を直接使用して、バイトi の値にアクセス/送信します。

于 2013-08-20T07:15:38.880 に答える
2

double を hex に変換してから、hex を double に変換します。

64 ビット整数をdouble. これは、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 に答える