字节数组为十进制

时间:2015-01-15 10:10:22

标签: c winapi

我有一个字节数组(64位无符号整数):

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

我想把它翻译成十进制.. 当我使用计算器窗口时,结果是:

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

3 个答案:

答案 0 :(得分:2)

在移位之前将字节转换为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);

或以相反的顺序(数组是小端;这将得到你在windows计算器中看到的结果):

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);

答案 1 :(得分:0)

好吧,你可以用

  1. sprintf()将位置十六进制值打印到字符串。
  2. 使用基数16使用strtoll()将该字符串转换为十进制。
  3. 示例代码:

    #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;
    
    
    }
    

答案 2 :(得分: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);