2014-01-25 52 views
0

我實現DES(與EBC)作爲學校工作的一部分。我使用布爾數組bool[64]<stdbool.h>該塊。該陣列使用對每個比特1個字節(I瞭解到這個硬盤的方式,當我試圖爲64bits的= 8個的memcpy字節而不是64個字節)。無論如何,如何進入位陣列?現在,我正在閱讀一個未簽名的long並將其轉換。如下圖所示:讀二進制文件轉換成布爾數組用C

unsigned long buf; 
bool I[64], O[64]; 
int ctr = 0; 
while((ctr = fread(&buf, 1, 8, fin))>0) { 
    dectobin(buf, I); 
    encrypt(I, O); 
    buf=bintodec(O); 
    fwrite(&buf, 8, 1, fout); 
    buf = 0; 
} 

的功能有:

void dectobin(unsigned long dec, bool bin[64]) 
{ 
    int i; 
    for(i = 0; i< 64; i++) 
     bin[i] = (dec>>(63-i)) & 1; 
} 

unsigned long bintodec(bool bin[64]) 
{ 
    unsigned long dec = 0; 
    int i; 
    for(i = 0; i < 64; i++) { 
     dec <<= 1; 
     dec |= (int)(bin[i]); 
    } 
    return dec; 
} 

有沒有更好的方式來做到這一點?

回答

1

您不容在一個bool陣列直接的fread位
(你將不得不讀取的字節和手動分配每個字節的每個8位)。

另一種解決方案,它也消耗更少的內存:
一個由8個字符組成的數組。
可以直接加fread-ed,並通過二進制訪問位或/和& |
如果你有一個char c和一個比特數爲n介於0和7:1
設置n位在C:0

c |= 1<<n; 

設置n位在C:

c &= ~(1<<n); 

檢查c中的位n是否爲1:

if(c & (1<<n)) 
+0

long會比char更好,因爲DES是64位塊密碼。但是在bool數組中實現操作更容易。 – avmohan

+0

你也可以乘坐8字節長,而不是8個char's。但事實是,你不能在bool數組中使用二進制1/0。 – deviantfan

+0

我收回我的意見。炭[8]是更好,因爲焦炭是已知的1個字節長的,但並不總是8個字節。 – avmohan

相關問題