2012-02-12 130 views
2

我想獲得無符號long long的二進制形式,並將它的每一位存儲在一個數組中。無符號long long的二進制表示

我有一個這樣的輸入的文件:

0000000000000000 0000000000000000 
FFFFFFFFFFFFFFFF FFFFFFFFFFFFFFFF 
3000000000000000 1000000000000001 

其中每個條目是十六進制表示的64位整數。我使用一個無符號long long來保存這個值,然後迭代這些位並嘗試將它們存儲在一個數組中,但是一些數組的位數錯誤。

以下是我有:

char key_in[17]; 
char plaintext_in[17]; 

//64-bit long variables to hold the 64-bit hex values in the input file 
unsigned long long key, plaintext; 

//I read an entry from the file with fscanf 
fscanf(infile,"%s %s",&key_in, &plaintext_in) 

//convert the numbers from hex to unsigned long long with strtoull 
key = strtoull(key_in, NULL, 16); 
plaintext = strtoull(plaintext_in, NULL, 16); 

//initialize arrays with 64 positions that will hold the 
//binary representation of the key and plaintext 
int key_arr[64]; 
int pt_arr[64]; 

//fill the arrays with the binary representations 
//of the plaintext and the key 
int64_to_bin_array(key, key_arr, 64); 
int64_to_bin_array(plaintext, pt_arr, 64);  

//print both arrays 
printArray(key_arr, 64); 
printArray(pt_arr, 64); 

這裏是我創建int64_to_bin_arrayprintArray功能:

/* Converts from an unsigned long long into an array of 
integers that form the binary representation of a */ 
void int64_to_bin_array(unsigned long long a, int *b, int length) 
{ 
    int i; 
    for(i = 0; i < length; i++) 
    { 
     *(b+i) = (a >> i) & 1; //store the ith bit in b[i] 
    } 
} 

/* prints a one-dimensional array given 
    a pointer to it, and its length */ 
void printArray(int *arr, int length) 
{ 
    int i; 
    for(i = 0; i < length; i++) 
    { 
     printf("%d ", *(arr + i)); 
    } 
    printf("\n\n"); 
} 

然而,當我打印第三輸入數組,我收到了不正確的結果:

輸入(十六進制):

1. 3000000000000000 2. 1000000000000001 

輸出(二進制):

1 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00001100 

2 10000000 00000000 00000000 00000000 00000000 00000000 00000000 00001000 

任何人都可以看到我犯了一個錯誤?

編輯

我同時獲得閱讀和打印反轉後的正確的輸出,但我的問題是我需要的數組首先最顯著字節,所以我可以操縱它。任何想法如何可以做到?我是否需要將它重新分配給一個新的數組並將它們反向複製?

+0

使用'B [I]'而不是'*(B + I)',它更清晰。 – Borealid 2012-02-12 06:49:29

+0

有兩個問題: - 什麼是最低位的位數? - 打印位時,最低位應該先打印(左邊)還是最後(左邊)? – 2012-02-12 06:56:16

+0

@DaleHagglund十六進制值是從一個人創建的文件讀入的,所以它們應該都是大端的。 – 2012-02-12 15:27:19

回答

5

試着以相反的方式閱讀它。讓我們取最後一個八位字節:

00001100 = 0x0C 
00110000 = 0x30 <--- 

這對應於您的第一個第一個八位組,0x30

對於第二個數字:

00001000 = 0x08 
00010000 = 0x10 <--- 

對應於你的第一個第一個字節,0x10

你可能會得到你所期望的,如果你打印這樣的:

for(i = length - 1; i >= 0; i--) 
+0

[示例](http://ideone.com/QiS99) – jfs 2012-02-12 07:52:49

+0

謝謝,那正是我的問題。 – 2012-02-12 15:39:44

+0

對於我的程序來說,我需要首先獲得最重要字節的二進制表示。任何想法我怎麼能做到這一點?我使用當前輸出重新編輯上面的內容。 – 2012-02-12 16:12:01