2013-08-20 2 views
-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.

ответ

6

unsigned long long latitude = 29.47667 не имеет большого смысла, unsigned long long - целочисленный тип. Таким образом, переменная получает только усеченное целое число 29.

Именно поэтому вы получаете только 0x1d, что равно 29 в гексагоне.

+0

Я хочу переменную на 64 разрядную. У меня есть typedef, подписанный long long int64_t, это сработает? – Ishmeet

+1

@Ishmeet 'long long' составляет как минимум 64 бит, это может быть больше. Поэтому переносимым способом является использование 'int64_t' в' stdint.h', если это доступно. –

+0

Я попытался с 'int', а также' int64_t', все равно получил тот же ответ, он не сработал. Можете ли вы мне рассказать, как значение 29.47667 преобразуется в шестнадцатеричный. Это происходит само по себе, или нам нужно сделать некоторые вычисления? – Ishmeet

-3

вы можете вызвать эту функцию, включив его в любом headerfile

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]); 
    } 
    } 
} 
+0

Он примет мое значение «double» и преобразует его в 'int', как' long int num', поэтому не даст правильный ответ, который требуется. – Ishmeet

+0

Это не делает ничего, чтобы решить проблему OP с использованием десятичных чисел. –

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

Или вы можете в принципе сделать 'memcpy (bytes, & val, 8);', Это сработало для меня :). – Ishmeet

+0

+1 для метода, но я думаю (не уверен), что 'memcpy()' внутренне реализует байты только по байтовой копии. –

+0

Предложите фиксированную ширину на 'printf()' ("% 03hhu"). – chux

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; 
} 
+0

Ничего себе! Отлично, но я не могу использовать PRIX64 и DBL_DIG + 2, так как я использую платформу Stm32L и использую UART в качестве отладочных сообщений. Но все же я попробую это без отпечатков. – Ishmeet

Смежные вопросы