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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

1593閲覧

Bytesデータを上手くデコードしたい。

upo78

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/05/17 09:57

前提・実現したいこと

pySerialを使って、シリアル通信をしていた所、受信したBytesデータの中身を上手く取れません。
上手く文字データにデコードする方法を教えていただけませんでしょうか。
よろしくお願いします。

シリアル通信の結果
①の出力:b'\x820\xb10\xb130\xb8\xb4\xb70\xb1\xb23\xb456\xb7\xb8900\xa0\xa0'
②の出力:�0ア0ア30ク550アイ3エ56キク900��

欲しい値:010130847012345678900

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

decode時に、「\xb1」で「ア」と判断されてしまう。

該当のソースコード

python3

1 2import tkinter 3import serial 4 5# method: connect_test_click 6def connect_test_click(): 7 comport = serial.Serial('COM3', baudrate=9600) 8 recv_data = comport.read(24) 9 print(recv_data) # for debug ① 10 print(recv_data.decode('sjis', 'replace')) # for debug ② 11 TestLabel["text"] = "Result:" + recv_data.decode('sjis', 'replace') 12 comport.close() 13 14# form 15root = tkinter.Tk() 16root.title(u"titleName") 17root.geometry("400x320") 18 19# button 20TestButton = tkinter.Button(text=u'接続テスト', width=20, command=connect_test_click) 21TestButton.grid(padx=10, ipady=10, pady=10) 22 23# label 24TestLabel = tkinter.Label(text=u'*****') 25TestLabel.grid(padx=10) 26 27root.mainloop() 28

試したこと

bytesをsliceで切り取ろうとしたのですが、「\xb1」で1文字と判定されて無理でした。

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

python3.7, pyserial3.5, visualStudio2019

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

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

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

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

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

quickquip

2021/05/17 11:17

1バイトごとに、16進ダンプ表示すると >>> print(' '.join(f'{b:x}' for b in b'\x820\xb10\xb130\xb8\xb4\xb70\xb1\xb23\xb456\xb7\xb8900\xa0\xa0')) 82 30 b1 30 b1 33 30 b8 b4 b7 30 b1 b2 33 b4 35 36 b7 b8 39 30 30 a0 a0 となるんですが、どうしてこれが 010130847012345678900 になるのかわかりませんでした。 010130847012345678900 になる**はず**と思っているのはどうしてなのでしょうか。 そのあたりを質問を編集して追記するといいのでは、と思いました。
upo78

2021/05/17 11:37

ありがとうございます。 説明が足りずに、すみません。 010130847012345678900 になるはずなのは機械の仕様からです。 byteデータ扱いなのですが、データ中にこの文字が入っては来てるのです。 \xbが制御コードと考え削除すると、綺麗にならんでいるので、取得データの扱いを間違えてるのだろうと考えてました。
quickquip

2021/05/17 11:55 編集

よくみたら「先頭ビットに1が立ってる」という解釈でよさそうでした。(回答にするほどでもないのでこの欄で失礼します)
guest

回答2

0

ベストアンサー

中身は理解していない回答です。

制御コードが入っていて、utf-8ではデコードできないような気がします。
無理矢理、変換するとこういうのになりますが、他の場合でもこれでできるのかどうかやってみてはいかがですか。

python

1>>> x = b'\x820\xb10\xb130\xb8\xb4\xb70\xb1\xb23\xb456\xb7\xb8900\xa0\xa0' 2>>> str(x).replace('\xb', '')[6:-9] 3010130847012345678900 4

投稿2021/05/17 11:13

ppaul

総合スコア24670

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

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

upo78

2021/05/17 11:31

そのままstrクラスにキャストできたんですね。 別データでもテストしてみます。 ありがとうございました。大変助かりました。
guest

0

投稿2021/05/17 10:05

y_waiwai

総合スコア88042

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

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

upo78

2021/05/17 11:01

ありがとうございます。 byteは必要なものに型変換が必要、文字データは全てutf-8と理解しました。 a_int = recv_data.decode("utf-8") Message='utf-8' codec can't decode byte 0x82 in position 0: invalid start byte a_int = recv_data.decode("utf-8", 'replace') �0�0�309390��3�56��900 文字化けしている部分「/xb1」がutf-8では無いのですね。 必ず、utf-8に変換が必要となると、文字化け部のbyte「/xb1」中の「1」のみを取得することはできないということでしょうか。
y_waiwai

2021/05/17 11:43

別の文字コードでもできますよ shift-jis でやってみたらどうでしょう
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問