numpy.array.tofile()二进制文件在记事本++中看起来很“奇怪”

时间:2015-04-22 22:21:30

标签: python numpy notepad++ hexdump

我只是想知道函数如何实际存储数据。因为对我来说,它看起来很奇怪。说我有以下代码:

import numpy as np
filename = "test.dat"
print(filename)
fileobj = open(filename, mode='wb')
off = np.array([1, 300], dtype=np.int32)
off.tofile(fileobj)
fileobj.close()

fileobj2 = open(filename, mode='rb')
off = np.fromfile(fileobj2, dtype = np.int32)
print(off)
fileobj2.close()

现在我希望文件中有8个字节,其中每个元素由4个字节表示(我可以使用任何字节顺序)。但是当我在十六进制编辑器中打开文件时(使用带有十六进制编辑器插件的notepad ++),我得到以下字节:

01 00 C4 AC 00

5个字节,我根本不知道它代表什么。第一个字节看起来像是数字,但接下来是奇怪的东西,当然不是“300”。

然而重新加载显示原始数组。

这是我在python中不理解的东西,还是在notepad ++中的问题? - 如果我选择不同的“编码”,我注意到十六进制看起来不同(嗯?)。另外:Windows报告它的长度为8个字节。

2 个答案:

答案 0 :(得分:2)

你可以非常轻松地告诉实际 的文件有8个字节,你期望的相同的8个字节(01 00 00 00 2C 01 00 00)只是通过使用除Notepad ++以外的任何东西来查看文件,包括仅用off = fileobj2.read()off = np.fromfile(fileobj2, dtype=np.int32)打印then b'\ x01 \ x00 \ x00 \ x00,\ x01 \ x00 \ x00'` <替换ing the bytes (which will give you SUP> * )。

而且,根据你的评论,在我提出建议之后,你尝试了它,并且看到了那个。

这意味着这是Notepad ++中的错误,或者是您使用它的方式存在问题; Python,NumPy和你自己的代码都很好。

*如果不清楚:'\x2c'','是相同的字符,bytes使用可打印的ASCII字符表示可打印的ASCII字符,以及像'\n'那样熟悉的转义,如果可能的话,只使用十六进制反斜杠转义为其他值。

答案 1 :(得分:0)

您期望var NavBar = React.createClass({ itemClicked: function(ev) { var items = this.state.items; var clickedId = ev.currentTarget.getAttribute("data-item-id"); var activeItem = {}; items.forEach(function(item) { if(item.id == clickedId) { activeItem = item; } item.active = item.id == clickedId; }); //let react do the work this.setState({items:items}); if(this.props.onItemChange) { this.props.onItemChange(activeItem); } }, getInitialState: function() { return {items: this.props.items}; }, render: function() { var navItems = this.state.items.map(function(item, idx) { var className = item.active ? "active" : ""; return <li key={item.id} className={className}><a href="#" data-item-id={item.id} onClick={this.itemClicked}>{item.description}</a></li>; }.bind(this)); return ( <ul className="nav nav-sidebar" id="nav-sidebar"> {navItems} </ul> ); } }); var App = React.createClass({ handleItemChange: function(item) { this.setState({selectedItem: item}); }, getInitialState: function() { return {selectedItem: {description:"Hello, FreeSWITCH!"}}; }, render: function() { return (<div> <h1>{this.state.selectedItem.description}</h1> <div id="sidebar"> <NavBar items={this.props.items} onItemChange={this.handleItemChange} /> </div> </div>); } }); var NAVLIST = [ {id: 1, description: 'OverView', active: true}, {id: 2, description: 'Calls'}, {id: 3, description: 'Channels'}, {id: 4, description: 'OverView'} ] React.render(<App items = {NAVLIST} />, document.getElementById('content')); 看起来像什么?

编写数组,并将其作为二进制读取(在ipython中):

300

有8个字节,In [478]: np.array([1,300],np.int32).tofile('test') In [479]: with open('test','rb') as f: print(f.read()) b'\x01\x00\x00\x00,\x01\x00\x00' 只是一个可显示的字节。

实际上,我不需要通过文件来获取此信息:

,

做同样的事情:

In [505]: np.array([1,300]).tostring()
Out[505]: b'\x01\x00\x00\x00,\x01\x00\x00'

当功率为2(且减少1)时,很容易识别字节中的模式。

[255] b'\xff\x00\x00\x00' [256] b'\x00\x01\x00\x00' [300] b',\x01\x00\x00' [1,255] b'\x01\x00\x00\x00\xff\x00\x00\x00' 将字节字符串转换回数组:

frombuffer

从最后一个表达式判断,In [513]: np.frombuffer(np.array([1,300]).tostring(),int) Out[513]: array([ 1, 300]) In [514]: np.frombuffer(np.array([1,300]).data,int) Out[514]: array([ 1, 300]) 只是将数组缓冲区写为文件。