2017-07-26 77 views
1

私はFATFSモジュールを使ってセンサーデータをSDカードに書き込む組み込みソフトウェアプロジェクトに取り組んできました。データのデータ型はuint32_t(4バイト)で、出力はバイナリファイルです。ロギングデータのバイナリファイルを読み込んでint(python)で新しいファイルに出力

私は、バイナリファイルを読み込み(そして、データをintに解析して新しいファイルに書き込む)pythonスクリプトを書こうとしています。私の現在のコード、

def read(): 
with open("INPUT1.TXT", "rb") as binary_file: 
    # Read the whole file at once 
    data = binary_file.read() 
    print(data) 

とそのヘクスでくれ値の塊を与え、

b' \x01 \x02 \x03 \x04 \x05 \x06 \x07 \x08 \t \n \x0b \ 
x0c \r \x0e \x0f \x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 
\x18 \x19 \x1a \x1b \x1c \x1d \x1e \x1f  \x01 \x02 \x03 
    \x04 \x05 \x06 \x07 \x08 \t \n \x0b \x0c \r \x0e \x0f 
\x10 \x11 \x12 \x13 \x14 \x15 \x16 \x17 \x18 \x19 \x1a \x1 
b \x1c \x1d \x1e \x1f  ' 

各4つのバイトを印刷する場合、いくつかの数字も、

f = open("INPUT2.TXT", "rb") 
try: 
    bytes_read = f.read(4) 
    while bytes_read: 
     print(bytes_read) 
     bytes_read = f.read(4) 
finally: 
    f.close() 

所与の結果が欠落しています

b' '  #supposed to be \x00 
b'\x01 ' 
b'\x02 ' 
b'\x03 ' 
b'\x04 ' 
b'\x05 ' 
b'\x06 ' 
b'\x07 ' 
b'\x08 ' 
b'\t '  #supposed to be \x09 
b'\n '  #supposed to be \x0a 
b'\x0b ' 
b'\x0c ' 
b'\r '  #supposed to be \x0d 
b'\x0e ' 
b'\x0f ' 
b'\x10 ' 
b'\x11 ' 
b'\x12 ' 
b'\x13 ' 
b'\x14 ' 
b'\x15 ' 
b'\x16 ' 
b'\x17 ' 
b'\x18 ' 
b'\x19 ' 
b'\x1a ' 
b'\x1b ' 
b'\x1c ' 
b'\x1d ' 
b'\x1e ' 
b'\x1f ' 

しかし、whe n 16進エディタでバイナリファイルを読み込み、すべてのバイナリが正しいように見えますか?

一度に4バイトを読み込み、新しいファイル(型int)に書きたい場合、どうすればできますか?

おかげで、

ヘンリー

+0

Python 2または3を使用していますか?若干の違いがあります。 – youngmit

+0

あなたが私が教えてくれるものを見逃していないので、あなたが "欠けている"と思う理由を[this](http://www.asciitable.com/)にチェックしてください。 – jacoblaw

+0

@youngmit私はPythonを使用しています3. – shjnlee

答えて

3
nums = [] 
with open("INPUT2.TXT", "rb") as file: 
    while byte: 
     byte = file.read(4) 
     nums.append(int.from_bytes(byte, byteorder="little")) 

これは、Python 3のためにこれを行う必要があります。

あなたのバイトがあなたの例から反転されているようです。彼らが反転されていない場合は、大きなものに戻してください。

もう奇妙なこと:それは0x00のように、\ X00 『「の代わりにBを、』 B」になってきているに見えます。その場合は、代わりに次のようにしてください:

nums = [] 
with open("INPUT2.TXT", "rb") as file: 
    while byte: 
     byte = file.read(4) 
     nums.append(int.from_bytes(byte.replace(b" ", b"\x00"), byteorder="little")) 

ここでは、提供した内容の例を示します。

>>> test = [b' ', 
b'\x01 ', 
b'\x02 ', 
b'\x03 ', 
b'\x04 ', 
b'\x05 ', 
b'\x06 ', 
b'\x07 ', 
b'\x08 ', 
b'\t ', 
b'\n ', 
b'\x0b ', 
b'\x0c ', 
b'\r ', 
b'\x0e ', 
b'\x0f ', 
b'\x10 ', 
b'\x11 ', 
b'\x12 ', 
b'\x13 ', 
b'\x14 ', 
b'\x15 ', 
b'\x16 ', 
b'\x17 ', 
b'\x18 ', 
b'\x19 ', 
b'\x1a ', 
b'\x1b ', 
b'\x1c ', 
b'\x1d ', 
b'\x1e ', 
b'\x1f '] 

>>> for t in test: 
>>>  print(int.from_bytes(t.replace(b" ", b"\x00"), byteorder="little")) 
0 
1 
2 
3 
4 
5 
6 
7 
8 
9 
10 
11 
12 
13 
14 
15 
16 
17 
18 
19 
20 
21 
22 
23 
24 
25 
26 
27 
28 
29 
30 
31 
+0

あなたの答えをありがとう。しかし、私はGribouillisの答えで非常に似た結果を得ました。数字は本当に大きな数字(無効)です[538976288、18882592、35659808、52437024、69214240、85991456、102768672、119545888、136323104、153100320、169877536、...]。なぜなのかご存知ですか? – shjnlee

+0

@shjnleeちょっと私はそれを更新しました。 – jacoblaw

+0

ありがとう! 2番目のコードブロックは期待通りに動作します! – shjnlee

0

あなたは、おそらくそれは、バイナリファイルにパックだけのuint32_t数字だ場合、私はあなたがファイルにread()機能を使用することができると思う

for i in range(0, len(data), 4) 
    d = struct.unpack('I', data[i:i+4]) 
    print(d) 
+0

あなたのコードを試しましたが、解凍後のデータは無効です(例:538976288、538976258、...)。 – shjnlee

0

でそれを行うことができます

num_list = [] 
with open("INPUT1.TXT", "rb") as binary_file: 
    byte_data = 0x1 # Initial placeholder for the loop 
    while byte_data: 
     byte_data = binary_file.read(4) # 4 being the number of bytes to read at a time 
     num_list.append(int(byte_data)) 
# Do something with num_list 
+0

変換int(byte_data)に問題がある可能性があります。 tryブロックを置く理由は、何らかの例外が発生しnum_listを表示するためですが、空です。 – shjnlee

関連する問題