在 C 中写入未格式化的直接访问二进制文件
Writing to an unformatted, direct access binary file in C
我正在尝试使用这个顽固的存储库来测试数字流的随机性 (https://github.com/reubenhwk/diehard)。它给出了它读取的文件类型的这些细节:
Then the command
diehard
will prompt for the name of the file to be tested.
That file must be a form="unformatted",access="direct" binary
file of from 10 to 12 million bytes.
这些是特定于 Fortran 的文件约定,不是吗?问题是,我正在使用 lfsr-generator 生成我的随机二进制流,这是在 C 中。我尝试将二进制流的 fputc
转换为文本文件或 .bin
文件,但是顽固派似乎不太接受
我没有使用 Fortran 的经验。有什么方法可以使用 C 创建这种文件类型吗?我是否只需要硬着头皮让 C 调用创建文件的 fortran 子例程?这是我的 C 代码供参考:
#include <stdio.h>
int main(void)
{
FILE *fp;
fp=fopen("numbers", "wb");
const unsigned int init = 1;
unsigned int v = init;
int counter = 0;
do {
v = shift_lfsr(v);
fputc( (((v & 1) == 0) ? '0' : '1'), fp);
counter += 1;
} while (counter < 11000000);
}
您创建的二进制文件很好。您的问题是您每个字节只写一个随机位(并将其扩展为文本)。 Diehard 希望每一点都是随机的。所以写之前一次累加8位:
do {
int b = 0;
for (int i = 0; i < 8; i += 1) {
v = shift_lfsr(v);
b <<= 1;
b |= (v & 1);
}
fputc(b, fp);
. . .
我正在尝试使用这个顽固的存储库来测试数字流的随机性 (https://github.com/reubenhwk/diehard)。它给出了它读取的文件类型的这些细节:
Then the command diehard will prompt for the name of the file to be tested.
That file must be a form="unformatted",access="direct" binary file of from 10 to 12 million bytes.
这些是特定于 Fortran 的文件约定,不是吗?问题是,我正在使用 lfsr-generator 生成我的随机二进制流,这是在 C 中。我尝试将二进制流的 fputc
转换为文本文件或 .bin
文件,但是顽固派似乎不太接受
我没有使用 Fortran 的经验。有什么方法可以使用 C 创建这种文件类型吗?我是否只需要硬着头皮让 C 调用创建文件的 fortran 子例程?这是我的 C 代码供参考:
#include <stdio.h>
int main(void)
{
FILE *fp;
fp=fopen("numbers", "wb");
const unsigned int init = 1;
unsigned int v = init;
int counter = 0;
do {
v = shift_lfsr(v);
fputc( (((v & 1) == 0) ? '0' : '1'), fp);
counter += 1;
} while (counter < 11000000);
}
您创建的二进制文件很好。您的问题是您每个字节只写一个随机位(并将其扩展为文本)。 Diehard 希望每一点都是随机的。所以写之前一次累加8位:
do {
int b = 0;
for (int i = 0; i < 8; i += 1) {
v = shift_lfsr(v);
b <<= 1;
b |= (v & 1);
}
fputc(b, fp);
. . .