2013-06-04 54 views
0

我有一个8字节计数器,我试图增加。我后来想将它转换为无符号的long long值。但转换后的值会引发错误。这是一个endian问题还是这是错误的? 请指教。从数组中简单的无符号long long转换

这里是我的代码:

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
typedef unsigned   char uint8_t; 
typedef unsigned short  int uint16_t; 
typedef unsigned   int uint32_t; 

#define COUNTER_LENGTH 8 

typedef struct { 
    uint8_t data[8]; 
}count_t; 

static void incrementCtr(count_t* count) { 
    int i; 
    for (i = sizeof(count->data) - 1; i >= 0; --i) { 
     if (++count->data[i] != 0) { 
      break; 
     } 
    } 
} 

int main(int argc, char *argv[]){ 

    count_t count; 
    count_t *counter; 
    counter = &count; 
    memset(counter ,0,sizeof(*counter)); 

    incrementCtr(counter); 
    int i; 
    for (i = 0; i < COUNTER_LENGTH; i++){ 
     printf("counter->data[%d] = %02X\n", i, counter->data[i]); 
    } 

    unsigned long long aa = 0; 
    int m; 
    for(m = 0; m< COUNTER_LENGTH; m++){ 
     aa = aa |(counter->data[m]<< m*8); 
    } 
    printf("aa = %llu\n", aa); 
    return 0; 
} 

回答

1

咦?

如果您确定unsigned long long足够大,那么您为什么要麻烦手动执行?为什么不使用unsigned long long变量?

你的循环中有一些破碎;表达式(counter->data[m] << m * 8)没有类型unsigned long long,因此可能会丢失很多位。

使用这样的事情:

for(m = 0; m < COUNTER_LENGTH; ++m) 
{ 
    a <<= 8; 
    a |= counter->data[m]; 
} 

上面也应该是尾数安全;它总是OR:s在最高有效字节中首先(由counter表示确定)。

+0

谢谢。其实我需要将“unsigned long long”计数器的值传递给一个带有unsigned char *输入的加密库。因此转换。 – user900785