如何正确读取二进制文件?

时间:2019-06-05 16:40:07

标签: c++ binaryfiles

我对NIST / Diehard Binary Matrix测试有问题。关于将二进制序列划分为32x32矩阵并计算其等级。计算等级后,我需要计算xi ^ 2值,然后计算p值(必须从0到1)。即使在随机序列中,我的p值也变得非常小。

尽管我认为我的问题是读取二进制序列文件并从中获取位,但我尝试硬编码一些小示例并获得正确的p值。

这是从文件读取并转换为位序列。

ifstream fin("seq1.bin", ios::binary);
    fin.seekg(0, ios::end);
    int n = fin.tellg();
    unsigned int start, end;
    char *buf = new char[n];
    fin.seekg(0, ios::beg);
    fin.read(buf, n);
    n *= 8;
    bool *s = new bool[n];
    for (int i = 0; i < n / 8; i++) {
        for (int j = 7; j >= 0; j--) {
            s[(i) * 8 + 7 - j] = (bool)((buf[i] >> j) & 1);
        }
    }

然后我形成矩阵并计算其排名

    int *ranks = new int[N];

    for (int i = 0; i < N; i++) {
        bool *arr = new bool[m*q];
        copy(s + i * m*q, s +(i * m*q) + (m * q), arr);
        ranks[i] = binary_rank(arr, m, q);
    }

在等级上发生口吃

int count_occurrences(int arr[], int n, int x){
    int result = 0;
    for (int i = 0; i < n; i++)
        if (x == arr[i])
            result++;
    return result;
}

计算xi ^ 2和p值

double calculate_xi(int fm, int fm_1, int remaining, int N) {
    double N1 = 0.2888*N;
    double N2 = 0.5776*N;
    double N3 = 0.1336*N;
    double x1 = (fm - N1)*(fm - N1) / N1;
    double x2 = (fm_1 - N2)*(fm_1 - N2) / N2;
    double x3 = (remaining - N3)*(remaining - N3) / N3;
    return x1 + x2 + x3;
}
double calculate_pvalue(double xi2) {
    return exp(-(xi2 / 2));
}

我希望p值介于0和1之间,但每次都为0。这是因为xi ^ 2值非常大,我找不到做错了什么。您能帮我解决问题吗?

1 个答案:

答案 0 :(得分:0)

对于这一部分:

for (int i = 0; i < n / 8; i++) {

    for (int j = 7; j >= 0; j--) {

        s[(i) * 8 + 7 - j] = (bool)((buf[i] >> j) & 1);
    }
 }

在将元素添加到s数组时,看起来就像切换了每个字符内字节的位置:buf中字符的最后一位进入s数组中字符的第一位,因为移位最初是7,所以您从buf []中获取char的第一位,但是对于s [],它看起来为0,从而导致交换。不过,通过调试器进行验证很容易,因为从代码来看并不是很明显。谢谢。