2015-01-15 3 views
-2

У меня есть массив байтов (64-разрядное целое число без знака):Byte массив в десятичные

byte array[8] = { 0x01,0xc9,0x98,0x57,0xd1,0x47,0xf3,0x60 } 

я хочу, чтобы перевести его в десятичную .. когда i'am с помощью калькулятора окон результат является:

128801567297500000

я не найти способ сделать это в WinAPI или C ..

Любая помощь приветствуется.

для массива из 4 байта я использовать рабочий код ниже

BYTE array[4] = { 0xC3,0x02,0x00,0x00 }; 
printf("Result : %d\n",(array[0]) | (array[1]) <<8 |(array[2]) <<16 | (array[3]) <<24 ); 
Result : 707 
+0

ваш «рабочий код» даже не компилируется. – specializt

+0

это не имеет никакого отношения к winapi –

+0

, как тяжело писать рабочие примеры? Это не компилируется: https://ideone.com/ZlCTyL – specializt

ответ

2

Cast байты на 64 перед перемещением. В настоящее время они неявно продвигаются до int, что является 32-битным типом данных.

Предполагая, что вы используете stdint:

uint64_t result = ((uint64_t)b[0]) | ((uint64_t)b[1] << 8) | ((uint64_t)b[2] << 16) | ((uint64_t)b[3] << 24) | ((uint64_t)b[4] << 32) | ((uint64_t)b[5] << 40) | ((uint64_t)b[6] << 48) | ((uint64_t)b[7] << 56);

или в обратном порядке (массив мало младший, это будет получить результат вы видите в окнах калькулятора):

uint64_t result = ((uint64_t)b[7]) | ((uint64_t)b[6] << 8) | ((uint64_t)b[5] << 16) | ((uint64_t)b[4] << 24) | ((uint64_t)b[3] << 32) | ((uint64_t)b[2] << 40) | ((uint64_t)b[1] << 48) | ((uint64_t)b[0] << 56);

0

хорошо, вы можете использовать

  1. sprintf() напечатать значения позиционных шестигранные в строку.
  2. преобразовать эту строку в десятичную с помощью strtoll() используя базу 16.

Пример кода:

#include <stdio.h> 
#include <stdlib.h> 

#define SIZE 128 

int main() 
{ 
    char array[8] = { 0x01,0xc9,0x98,0x57,0xd1,0x47,0xf3,0x60 }; 

    char arr[SIZE] = {0}; 
    int i = 0; 
    unsigned long long res = 0; 
    for (i = 0; i < 8; i++) 
     sprintf((arr + (i * 2)), "%2x", (array[i] & 0xff)); 

    printf("arr is %s\n", arr); 

    res = strtoll(arr, NULL, 16); 
    printf("res is %llu\n", res); 

    return 0; 


} 
+0

Er, вы действительно не должны использовать текст для этого вообще –

0
int i; 
byte array[8] = { 0x01,0xc9,0x98,0x57,0xd1,0x47,0xf3,0x60 }; 
unsigned long long v; 

//Change of endian 
for(i=0;i<4;++i){ 
    byte temp = array[i]; 
    array[i] = array[7-i]; 
    array[7-i] = temp; 
} 
v = memcpy(&v, array, sizeof(v));//*(unsigned long long*)array; 
printf("%llu ", v); 
+4

'v = * (unsigned long long *) array;' нарушает правило строгого сглаживания. – mch

+0

проблем нет в системах x86. – BLUEPIXY

+0

[htonll] (http://msdn.microsoft.com/ja-jp/library/windows/desktop/jj710199 (v = vs.85) .aspx) – BLUEPIXY

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