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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

Q&A

解決済

2回答

322閲覧

pythonのテキスト処理について

umechan47

総合スコア17

Python 2.7

Python 2.7は2.xシリーズでは最後のメジャーバージョンです。Python3.1にある機能の多くが含まれています。

0グッド

1クリップ

投稿2017/09/29 04:38

編集2017/09/29 08:13

バイナリ文字の処理なのですがうまく変換できずに混乱してしまったので,質問致します.

python2.7でバイナリ文字の処理をしています.

2の補数,4バイト固定小数点です.
例えば,
bitからhexへ変換しています.

python2.7

1int(x, 16)/2**24

で処理して,以下の3つの値があります.
本来は負で出るはずなのですが,うまく処理できていません.
正の値は正しい値で得られます.

fff622cc fffc954b 01006cb4
255.961468458 255.98665303 255.898968458

修正版

python2.7

1msg = ser.serial.readline().encode('hex') 2 3if len(msg) == 2*20: 4 dtype = msg[0:2] 5 d = int(msg[2:4],16) 6 7hex_accX = msg[4:12] 8hex_accY = msg[12:20] 9hex_accZ = msg[20:28] 10hex_temp = msg[28:34] 11 12# Hex to Decimal 13accX = int(hex_accX, 16)/float(2**24) 14accY = int(hex_accY, 16)/float(2**24) 15accZ = int(hex_accZ, 16)/float(2**24) 16print hex_accX, hex_accY, hex_accZ, hex_temp 17print accX, accY, accZ, temp

で得られたデータがとなり,2個めのYの値が-ではなく正の値で出てきているため,負の値へ正しく変換するためにはどんな処理が必要でしょうか.
00007a0f fffbe7e3 0100b297
0.0018624663353 255.984007061 1.00272506475

bit[31] 符号部
bit[30:24] 整数部
bit[23:0] 小数部
となっています.

どなたか解る方ご教示いただければと思います.
よろしくお願い致します.

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

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

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

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

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

can110

2017/09/29 05:32

現象が再現する最小限のコードを提示すると第三者も検証でき、回答得られやすいと思います。
miyahan

2017/09/29 06:50

0x01006cb4 って 符号部が 0b、整数部が 000 0001b なので、1.xx ですよね?正の値もおかしいのでは?
umechan47

2017/09/29 08:14

おっしゃる通りです.一部コードが問題ありましたので,修正いたしました.
guest

回答2

0

ベストアンサー

こんな感じでしょうか?
int(...)では符号付値に変換できないようなので、符号付値に変換する関数をかませました。

Python

1# 32bit符号無→符号付値に変換 2def s32(value): 3 return -(value & 0b10000000000000000000000000000000) | (value & 0b01111111111111111111111111111111) 4 5def toFloat( hex): 6 n = s32( int(hex, 16)) 7 f = n / float(2**24) 8 return f 9 10hex_accX,hex_accY,hex_accZ = "00007a0f", "fffbe7e3","0100b297" 11 12accX = toFloat( hex_accX) 13accY = toFloat( hex_accY) 14accZ = toFloat( hex_accZ) 15 16print accX, accY, accZ 17# 0.0018624663353 -0.0159929394722 1.00272506475

参考:Pythonで符号付き8bit整数を扱う(2の補数)

投稿2017/09/29 08:51

can110

総合スコア38233

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

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

0

"2の補数,4バイト固定小数点" という仕様をバカ正直に実装するとこんな感じでしょうか。

python

1def bin2dec(b): 2 bits = format(int(b, 16), 'b').zfill(32) 3 if bits[0:1] == '1': 4 intg = int(bits[1:8], 2) - pow(2, 7) # integer part (x < 0) 5 else: 6 intg = int(bits[1:8], 2) # integer part (x >= 0) 7 frac = pow(2, -24) * int(bits[8:32], 2) # fractional part 8 return intg + frac 9 10nums = ['00007a0f', 'fffbe7e3', '0100b297'] 11for num in nums: 12 print('{!r} is {}'.format(num, bin2dec(num))) 13 14# '00007a0f' is 0.0018624663353 15# 'fffbe7e3' is -0.0159929394722 16# '0100b297' is 1.00272506475

1ビット目が立っていたら補数を計算する処理を入れないとだめだと思います。

投稿2017/09/29 09:00

miyahan

総合スコア3095

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問