如何收集二进制文件中字节出现的统计信息?

如何收集二进制文件中字节出现的统计信息?

我想知道相当于

cat inputfile | sed 's/\(.\)/\1\n/g' | sort | uniq -c

提出于https://stackoverflow.com/questions/4174113/how-to-gather-characters-usage-statistics-in-text-file-using-unix-commands用于在文本文件中生成字符使用统计信息 对于二进制文件,计算简单字节而不是字符,即输出应采用以下形式

18383 57
12543 44
11555 127
 8393 0

该命令是否需要与引用的字符一样长的时间并不重要。

如果我将字符命令应用于二进制文件,则输出包含不可打印字符的任意长序列的统计信息(我不寻求对此的解释)。

答案1

使用 GNU od

od -vtu1 -An -w1 my.file | sort -n | uniq -c

或者更有效地使用perl(还为未出现的字节输出计数(0)):

perl -ne 'BEGIN{$/ = \4096};
          $c[$_]++ for unpack("C*");
          END{for ($i=0;$i<256;$i++) {
              printf "%3d: %d\n", $i, $c[$i]}}' my.file

答案2

对于大文件,使用排序会很慢。我编写了一个简短的 C 程序来解决等效问题(请参阅此要点以了解带有测试的 Makefile):

#include <stdio.h>

#define BUFFERLEN 4096

int main(){
    // This program reads standard input and calculate frequencies of different
    // bytes and present the frequences for each byte value upon exit.
    //
    // Example:
    //
    //     $ echo "Hello world" | ./a.out
    //
    // Copyright (c) 2015 Björn Dahlgren
    // Open source: MIT License

    long long tot = 0; // long long guaranteed to be 64 bits i.e. 16 exabyte
    long long n[256]; // One byte == 8 bits => 256 unique bytes

    const int bufferlen = BUFFERLEN;
    char buffer[BUFFERLEN];
    int i;
    size_t nread;

    for (i=0; i<256; ++i)
        n[i] = 0;

    do {
        nread = fread(buffer, 1, bufferlen, stdin);
        for (i = 0; i < nread; ++i)
            ++n[(unsigned char)buffer[i]];
        tot += nread;
    } while (nread == bufferlen);
    // here you may want to inspect ferror of feof

    for (i=0; i<256; ++i){
        printf("%d ", i);
        printf("%f\n", n[i]/(float)tot);
    }
    return 0;
}

用法:

gcc main.c
cat my.file | ./a.out

答案3

由于平均值、sigma 和 CV 在判断二进制文件内容的统计数据时通常很重要,我创建了一个 cmdline 程序,将所有这些数据绘制为与 sigma 字节偏差的 ascii 圆。
http://wp.me/p2FmmK-96
它可以与 grep、xargs 等工具一起使用来提取统计信息。 在此输入图像描述

答案4

这与 Stephane 的答案类似,od但它显示了字节的 ASCII 值。它还按出现频率/次数排序。

xxd -c1 my.file|cut -c10-|sort|uniq -c|sort -nr

我认为这效率不高,因为启动了许多进程,但它对于单个文件,特别是小文件很有好处。

相关内容