int parity (char msg[1400]) {
int parity = 0;
int i,j;
char c;
for(i=0;i<strlen(msg);i++) {
for(j=0;j<8;j++) {
c = msg[i];
int bit = (c>>j)&1;
parity ^= bit;
}
}
return parity;
}
对于下一个例子,此函数返回一个好的结果:
char* msg = malloc(sizeof(char*)*1400);
strcpy(msg,"some string");
int parity = parity(msg);
对于下一个例子,结果并不好:
char* msg = malloc(sizeof(char*)*1400);
FILE *fp;
fp = fopen(filename,"r"); //filename is a binary file
while( !feof(fp) ){
fread(msg,1399,sizeof(char),fp);
int parity = parity(msg); //--> the result isn't well
//.......
}
当我从文件中读取时,我看到strlen(msg)在每一步(192,80,200 ...等)都是可变的。我必须改变&#34;平价&#34;第二个例子的功能。有什么建议吗?
答案 0 :(得分:1)
除了平价之外还有其他问题,但让我们关注那个问题。
查找所有字节的奇偶校验,一次1个字节,而不是一次1个字节。下一个:char
的奇偶校验。如果char
是8位,则需要3次迭代。 (LOG2(CHAR_BIT))
int parity(const char msg[], size_t len) {
// XOR all bytes together
unsigned par = 0;
while (len > 0) {
par ^= msg[--len];
}
// Find char parity
unsigned width = CHAR_BIT;
do {
par ^= par >> (width/2);
width -= width/2;
} while (width > 1);
// Only return Least Significant Bit
return parity % 2;
}
#define Width 1400
char msg[Width];
fread(msg, Width, sizeof *msg, fp);
int par = parity(msg, Width);
如果数组的长度是sizeof(unsigned)
的倍数。这速度提高了4倍(sizeof unsigned/sizeof char
)。
int parity_u(const unsigned msg[], size_t unsigned_len) {
// XOR all unsigned together
unsigned par = 0;
while (len > 0) {
par ^= msg[--len];
}
// Find unsigned parity
unsigned width = sizeof *msg * CHAR_BIT;
do {
par ^= par >> (width/2);
width -= width/2;
} while (width > 1);
// Only return Least Significant Bit
return parity % 2;
}
#define Width (1400/sizeof(unsigned))
unsigned msg[Width];
fread(msg, Width, sizeof *msg, fp);
int par = parity_u(msg, Width);
答案 1 :(得分:0)
我会完全避免feof()
- fread()
告诉你它读取了多少字节。另外你说它是一个二进制文件,但你使用的是字符串函数 - 它们无法正常工作。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#define BUFMAX 1400
int main(void){
unsigned char buffer[BUFMAX];
int i, bit, len, parity = 0;
FILE *fp;
if ((fp = fopen("myfile.dat", "rb")) == NULL) {
printf("Cannot open file\n");
return 1;
}
while ((len = fread(buffer, 1, BUFMAX, fp))) {
for (i=0; i<len; i++) {
for (bit=0; bit<CHAR_BIT; bit++) {
parity ^= (buffer[i] & 1);
buffer[i] >>= 1;
}
}
}
fclose (fp);
printf ("Parity = %d\n", parity);
return 0;
}