Generating a raw bit stream as an output to pipe in another software
所以,我一直在努力解决以下问题:
我有一个包含数百万随机数的文本文件。它们是纯文本。我想将它传送到另一个应该获得比特流的软件的输入(Dieharder 是软件)。
它适用于 /dev/urandom,例如:
1
|
cat /dev/urandom | ./dieharder <options>
|
我已经创建了一个类似的 C 例程来生成二进制原始输出流。它将 ASCII 码转换为十进制(如 0x0F = 15),并将其流式传输到标准输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
#include <stdio.h>
#include <errno.h>
#include <stdlib.h>
#include <string.h>
int ASCIItoDec (char c );
int main(int argc, char *argv[]) { FILE *fpr; FILE *fpw; unsigned int i = 0; size_t size=0; char c; unsigned int *buffer; char *filename; buffer = (unsigned int *) malloc(100); filename = (char *) malloc(128);
if (argc != 2) { scanf("%s", filename); fpr = fopen(filename,"rb"); } else { filename = (char *) realloc(filename, strlen(argv[1] + 1)); strcpy(filename, argv[1]); fpr = fopen(filename,"rb"); } if (fpr == NULL) { return –1; } while (c = fgetc(fpr) != EOF) { size++; } rewind(fpr); buffer = (int *) realloc(buffer, (size)*sizeof(int)); memset(buffer, 0, sizeof(buffer)); i=0; c = fgetc(fpr); while (c != EOF) { if ((c != ‘ ‘) && (c != ‘/ ‘) && (c != ‘/ ‘) && (c != ‘//t’)) { buffer[i] = (unsigned int) ASCIItoDec(c); } else if (c == ‘ ‘) { buffer[i] = ‘ ‘; } c = fgetc(fpr); i++; } fclose(fpr); i=0; //streaming output fwrite(buffer, size*sizeof(buffer), 1, stdout); return 0; } |
Dieharder 软件退出通知 EOF 已到达,但未执行任何分析。
什么可能是错的?
- while (c = fgetc(fpr) != EOF) 是错误的。应该是 while ((c = fgetc(fpr)) != EOF),但您还需要将 c 声明为 int,而不是 char。
-
我对此感到抱歉。 ASCIItoDEC 只是一个将 ASCII 转换为十六进制的函数。我将编辑并添加标题。
-
memset(buffer, 0, sizeof(buffer)); 没有意义。 sizeof buffer 为您提供指针的大小(即 sizeof (unsigned int *))。
-
谢谢它应该是 size*sizeof(buffer)
-
您正在使用具有不同”单位”的 buffer :初始分配是 malloc(100) (即 100 字节)。然后它被调整为 (size)*sizeof(int) (即 size 整数)。 memset 将其视为单个指针。最后 fwrite 将其视为 size*sizeof(buffer) (即 size 指针)。这些都不适合。
-
@cleveraintwise 如果有的话,它应该是 size * sizeof *buffer 或 size * sizeof (unsigned int)。
-
strlen(argv[1] + 1) 是一个二乘错误。以下 strcpy(filename, argv[1]); 调用在分配结束后写入两个字节。
问题在于软件输入文件规则。
二进制文件已正确生成。
谢谢。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/269318.html