关于 c:生成原始比特流作为输出到另一个软件中的管道 | 珊瑚贝

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]); 调用在分配结束后写入两个字节。


问题在于软件输入文件规则。
二进制文件已正确生成。
谢谢。


来源:https://www.codenong.com/53287509/

微信公众号
手机浏览(小程序)
0
分享到:
没有账号? 忘记密码?