質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2447閲覧

Pythonでnumpy.float32をバイナリデータに変換した結果がおかしい?

marusa

総合スコア16

バイナリ

バイナリは、「0」と「1」だけで表現されている2進数のデータ形式。または、テキスト以外の情報でデータが記述されているファイルを指します。コンピューター内の処理は全て2進数で表記されています。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/08/26 05:52

前提・実現したいこと

以前の質問に関連のある内容です。
numpy.float32型のデータを16進数のバイナリデータへ変換し、文字列としてファイル(save_1.txtとします)に保存しております。
その際、文字列へ変換せずバイナリデータのままファイル(save_2.txt)に保存することにしました。

保存するfloat32型のデータは np.array([0.0005268761, 0.0000000001, 0.003])としています。
バイナリデータはリトルエンディアンで格納しています。

発生している問題・エラーメッセージ

save_1.txtの文字列と、save_2.txtのバイナリデータの値が合わないという問題が発生しました。

save1

10e1e0a3a 2ffe6db2e 3a69b443b

save2

10E 1E 0D 0A 3A 2FF E6 DB 2E 3A6 9B 44 3B

上記save2はバイナリエディタ上の表示に改行を加えております。
save2 1行目の3バイト目の位置に、0Dという値が入ってしまっているのが問題点です。

該当のソースコード

Python

1import os 2import argparse 3import sys 4import glob 5import numpy as np 6import struct 7import binascii 8 9data = np.array([0.0005268761, 0.0000000001, 0.003], dtype = np.float32) 10 11f1 = open("save_1.txt", mode = 'w') 12f2 = open("save_2.txt", mode = 'w') 13 14for i in data: 15 b = struct.pack('<f', i) 16 s = binascii.b2a_hex(b) 17 f1.write(s) 18 f1.write("\n") 19 20 f2.write(b) 21 continue 22 23f1.close() 24f2.close()

試したこと

  • 0e1e0a3a (save1の1行目)
  • 0E 1E 0D 0A (save2の1行目)

上記二つの値をこちらのサイトでそれぞれ確認しました。
結果として0.0005268761は0E 1E 0A 3A(save1)で表されることがわかっています。

補足情報(FW/ツールのバージョンなど)

Python2.7
Windows10 64bit

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

f2をバイナリモードでopenする必要があります。

python

1f2 = open("save_2.txt", mode = 'wb')

0x0aは改行コード(\n)なので、bなしのアスキーモードで開いたファイルにwriteすると、
復帰(\r)の0x0dも一緒に書き込まれます。(Windowsの場合)

投稿2020/08/26 06:01

bsdfan

総合スコア4560

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

marusa

2020/08/26 06:22

ご回答ありがとうございます。\nにあたる0x0aが含まれている場合、その前に\rに当たる0x0dが一緒に書き込まれてしまっていたのですね。納得しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問