我只是想知道函数如何实际存储数据。因为对我来说,它看起来很奇怪。说我有以下代码:
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个字节。
答案 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])
只是将数组缓冲区写为文件。