QA@IT

Python3によるJSON電文からのバイト配列復元

12422 PV

 元々、自身がJavaで構築した無線デバイス電文受信のための自社パッケージを、
自己学習でGoogle Cloud FunctionsのPython3.7ランタイムに移植を試みようとしております。
ただ、何分、Pythonは初学者のため、オンラインドキュメントを眺めつつ、WEBサイトで調べつつ試行錯誤しておりますが、
なかなかうまくいきません。
もし興味を持って頂けましたら、ご回答頂けますと幸いです。

 以下、質問内容となります。
また、電文(JSON)は生ではなく、簡略しています。

 デバイスから以下のようなJSON形式の電文をHTTPでGoogle Cloud Functions(Python3.7ランタイム)のURLへポストさせております。

 {"data":{"payload":"[16,0,32,-51,59,74,77,-63,-105]","eui":"XXX-XXXX-XXXX-XXXXX","timestamp":"2018-07-28T07:52:42.869Z"}}

送信前のデータ部(payload)は以下のようになり、

 [0x10,0001000000000000,-65.3125,17.59375,-0.3317871]

仕様は、

 1バイト目:INT(16進数)
 2バイト~3バイト目:INT(ビット)
 4バイト~5バイト目:Float
 6バイト~7バイト目:Float
 8バイト~9バイト目:Float
 ※エンディアンはビッグエンディアン

です。
こちらを以下のようなPython3.7コードで復元を試みております。

json = request.get_json()
data = json['data']
eui = data['eui']
payload = data['payload'].replace('[', '').replace(']', '').split(',')
dataTypeCode = bytes.fromhex(payload[0]).hex()
dataStatus = int.from_bytes(bytearray([int(payload[1]), int(payload[2])]), byteorder='big', signed=True)
import struct
acc = struct.unpack('>e', bytearray([int(payload[1]), int(payload[2])]))
vel = struct.unpack('>e', bytearray([int(payload[5]), int(payload[6])]))
temp = struct.unpack('>e', bytearray([int(payload[7]), int(payload[8])]))

現状、INT(dataStatus)とFloat(acc、vel、temp)の復元でエラメッセージが「byte must be in range(0, 256)」のように出力されて変換出来たりできなかったりです。

以上、よろしくお願い致します。

回答

 自己解決出来そうです、参考までに修正後のコードを記載致します。

json = request.get_json()
data = json['data']
eui = data['eui']
payload = data['payload'].replace('[', '').replace(']', '').split(',')
dataTypeCode = bytes.fromhex(payload[0]).hex()
dataStatus = int.from_bytes(npyio.bytes(payload[1] + payload[2],'UTF-8'), byteorder='big', signed=True)
acc = npyio.np.float16(bytearray(payload[3] + payload[4],'UTF-8'))
vel = npyio.np.float16(bytearray(payload[5] + payload[6],'UTF-8'))
temp = npyio.np.float16(bytearray(payload[7] + payload[8],'UTF-8'))

編集 履歴 (0)
ウォッチ

この質問への回答やコメントをメールでお知らせします。