我在ascii中有一个二进制字符串,我想在Python中转换为原始二进制文件

时间:2015-10-26 14:38:21

标签: python matlab

首先,我环顾四周找到了这个:

In python, how to convert a hex ascii string to raw internal binary string?

https://docs.python.org/3/library/base64.html

哪个好,但似乎涉及将十六进制转换为二进制表示。而base64似乎不支持我想要的东西,或者我是不是很傻?

我所拥有的是来自Matlab的代码,它以16位带符号二进制形式输出数据。但它应该保存为原始二进制文件,而不是.m。所以我把它推到了.txt文件中。因此它以ASCII为生,这很好,除了我需要它作为一个纯粹的.bin。

我试图对此懒惰并搜索工具,只是让我将数据复制并粘贴到虚拟文件中。但无论出于何种原因,我都失败了。

很好,我可以写一个python代码打开数据并将数据块分成16位块一些逻辑代码并将其写为ACII实现,然后执行(https://docs.python.org/2/library/binascii.html)转换并写入文件?

这看起来非常可怕(可能是因为它)。我怎样才能以更优雅,更优选,更懒惰的方式解决这个问题?

===

简短版:我的数据是0000111001000011(16号),用ASCII编码,我希望在原始bin中为0000111001000011。我笨,需要帮助。

3 个答案:

答案 0 :(得分:0)

对输入字符串使用int(string,base),对二进制数据使用base 2.

a = int('0000111001000011',2)

其中a3651

现在您可以使用python struct

将其写入文件
import struct   
outString = struct.pack('i',a) # i for signed int 16bit, 
                               # for others check the documentation

f = open('outfile','w')
f.write(outString)
f.close()

答案 1 :(得分:0)

您似乎想从Matlab编写16位二进制原始文件?

只需在matlab中使用'fwrite'命令,例如

fid=fopen('mybinaryfile.bin','wb')
fwrite(fid,data,'uint16')
fclose(fid)

答案 2 :(得分:0)

感谢fwrite指针。 (好的,这次真的有效) 编。不,它不做原始二进制写。这是一些格式化......

小心! Python和字节喜欢在使用file.write(list_of_bytes)时进行格式化。这让我头疼,试图解决这个问题,然后再回到bittring库,基本上在半分钟内解决它。 叹息

以下代码可以满足我的需求:

##Importing my needed tools
import bitstring

##Open the file with the data
data = open('Path\\data.txt');

##Read from the file
buffer = data.read();

##Convert the data to the proper format for transering
bin_list = bitstring.BitArray(bin = str(buffer));
b_array = bin_list.bin

##Create a c switch equivalent function of sorts, because of hex 
def cswitch(x):
    if ((x == '1') or (x == '2') or (x == '3') or (x == '4') or (x == '5') or (x == '6') or (x == '7') or (x == '8') or (x == '9') or (x == '0') or (x == 'a') or (x == 'b') or (x == 'c') or (x == 'd') or (x == 'e') or (x == 'f')):
    x = {'1':'01', '2':'02', '3':'03', '4':'04', '5':'05', '6':'06', '7':'07', '8':'08', '9':'09', '0':'00', 'a':'0a', 'b':'0b', 'c':'0c', 'd':'0d', 'e':'0e', 'f':'0f'}[x];
        return x;
    else:
        return x;

#Create a "hexifier" function
def hexifier(x):
    x = bytes.fromhex( cswitch((hex ( int( x[:8],2) ) )[2:]) )
    return x;

##Init shenanigans
b2_array = bitstring.BitArray(hexifier(b_array));
b_array = b_array[8:];

##Prepare to write to mem in byte chunks by building a hex array
for i in range (0, 2**13-1):    
    #Format the data in byte sized chunks
    b2_array.append(hexifier(b_array));
    b_array = b_array[8:];

## Write to a file, using the format .write() likes
with open('path\\binary_data.bin', 'br+') as f:
        f.write(b2_array.bytes);

##Close the files   
data.close();   
f.close();