2014-01-25 3 views
0

학교 일의 일부로 DES (EBC 포함)를 구현 중입니다. 부울 배열을 bool[64]에서 <stdbool.h>까지 사용하고 있습니다. 배열은 각 비트마다 1 바이트를 사용합니다. 64 바이트 대신 memcpy를 시도했을 때 64 바이트 대신 8 바이트를 시도했을 때 어려운 방법이라고 배웠습니다. 어쨌든, 어떻게 비트 배열로 fread하려면? 지금, 나는 서명되지 않은 long으로 읽고 그것을 변환하고있다. 아래처럼 :C에서 bool 배열로 이진 파일 읽기

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 수 있으며 비트는 이진 Or/And & |
당신은 문자 c와 비트 번호가있는 경우 n은 0 ~ 7 :
설정 비트 n C에서 1 :

c |= 1<<n; 

설정 비트 n C에서 0 :

c &= ~(1<<n); 

c의 n 비트가 1인지 확인하십시오.

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

DES는 64 비트 블록 암호이므로 char보다 더 좋을 것입니다. 그러나 bool 배열에서 작업을 구현하는 것이 더 쉽습니다. – avmohan

+0

8 문자 대신 8 바이트 길이를 사용할 수도 있습니다. 사실, bool 배열에서는 fread binary 1/0을 사용할 수 없습니다. – deviantfan

+0

나는 나의 코멘트를 되 찾는다. char [1]은 1 바이트이지만 길이가 항상 8 바이트는 아니기 때문에 char [8]가 더 좋습니다. – avmohan