2
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...等)都是可变的。对于第二个示例,我必须更改“奇偶校验”功能。有什么建议么?

4

2 回答 2

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);
于 2015-03-27T22:00:02.360 回答
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;
}
于 2015-03-27T21:02:39.147 回答