如何从文件读取和处理二进制(基-2)逻辑表示

0 投票
6 回答
2037 浏览
提问于 2025-04-15 11:07

我有一个文件,里面有800行数据,像这样:

id       binary-coded-info
---------------------------
4657     001001101
4789     110111111
etc.

每个0或1代表某个特征的存在。我想读取这个文件,然后对这些二进制信息进行几种按位逻辑运算(具体操作取决于用户输入和另一个有3000行的文件中的信息)。最后,我希望把重新计算后的二进制信息写入文件中,并且要加上后面的零,比如:

4657     000110011
4789     110110000
etc.

我该怎么做才能不自己写一个进制转换的程序呢?我对任何方法都持开放态度,包括我不熟悉的语言,比如Python、Perl等。而且这个过程应该不需要编译。

到目前为止,我尝试过用脚本、awk和sed来处理。这意味着(我想):批量读取二进制数据,转换成十进制,根据用户输入和第二个文件进行按位操作,然后再转换回二进制,加上前导零并打印出来。通常控制台提示使用bc,但我觉得这不太优雅,因为文件里有很多行。dc和sed也是如此。而且awk似乎没有类似于将输入标记为二进制的功能(就像“echo $((2#101010))”那样),而且printf的技巧在处理二进制时也不奏效。那么,我该怎么做才能更优雅地实现这一切呢?

6 个回答

0

在C语言中,你可以用“strtol(str, NULL, 2)”来进行转换,如果你已经在用C语言的话。

像下面这样就可以工作:

FILE* f = fopen("myfile.txt", "r");
char line[1024];
while ((line = fgets(line, sizeof(line), f))
{
  char* p;
  long column1 = strtol(line, &p, 10);
  long column2 = strtol(p, &p, 2);
  ...
}

你还需要添加一些错误处理的代码等等。

1

在Python中,你可以通过使用整数类型的转换功能,把数字转换成二进制,只需要指定基数为2。比如:

>>> int('110111111',2)
447

如果你想把二进制转换回来,Python 2.6和3里有一个叫做bin的函数可以用,但在Python 2.5里没有这个函数,所以你需要自己实现这个功能(或者使用下面的代码):

def bin(x, width):
    return ''.join(str((x>>i)&1) for i in xrange(width))[::-1]

>>> bin(447, 9)
110111111

(这里的宽度是指要填充到的数字位数——你的例子似乎使用的是9位的数字。)

3

为什么要转换它们并使用位运算呢?

在Python中,你可以把这些都当作字符串来处理。

for line in myFile:
    key, value = line.split()
    bits = list(value)
    # bits will be a list of 1-char strings ['1','0','1',...]
    # ... do stuff to bits ...
    print key, "".join( value )

撰写回答