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

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

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

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

Python 3.x

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

Q&A

2回答

4130閲覧

python bytes型への変換でASCIIが混じってしまう

zyoubutu

総合スコア4

ASCII

ASCIIは、米国規格協会(ANSI)が制定したコンピューターの情報交換のための文字コードの一つ。アルファベットや数字などを1文字当たり7ビットで表します。英数字を表示する文字コードの中で最も高い互換性を持ち、多くの通信機器に利用されています。

Python 3.x

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

String

Stringは、ゼロ以上の文字から連続してできた文字の集合を扱うデータ型です。基本的にテキストを表すために使われます。

Python

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

0グッド

0クリップ

投稿2018/12/12 16:08

編集2018/12/12 16:39

前提・実現したいこと

ある数を16Bytesのバイナリデータ(ASCIIコードが入らないような状態)に変換したいと思っています.
これは,マイコン側へ送信する際に\x09を\tと表現していると数値を正しく認識しないためです.

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

to_bytes()やstruct.packなどためすと
ASCIIで表現できるコードはASCIIで表現するという仕様にぶつかり解決できない状況です.

そこで以下のようなコードを書き実行しましたが所望の動作を実現できませんでした.

該当のソースコード

hex_str = format(9, '#034x')
hex_str = hex_str[2:]
Text1 = '\x' + '\x'.join([(i+j) for (i,j) in zip(hex_str[::2],hex_str[1::2])])
Text2 = hex_str.encode('utf-8')
Text3 = (9).to_bytes(16, 'big')

//出力
\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x09
b'00000000000000000000000000000009'
b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t'

試したこと

structのpack関数やto_bytes()等を試しましたが仕様上実現できませんでした.
str型で形を作ることはできましたがこれをbytes型へキャストすることもできず困っています

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

can110

2018/12/12 16:31

バイナリデータに変換はできています。https://teratail.com/questions/81527 「\t」など、ASCII文字も、16進表記でprintや文字列化したいということでしょうか?
zyoubutu

2018/12/12 16:44

勉強不足ですみません. can110さんの指摘のように\tなどASCII文字も16進数表現したいということです. つまり,b'\x09'のような状態を作りたいというのが質問の趣旨です. 張っていただいたリンクのようなstr型での実現はすでにできている状況です. pythonの使用上b'\x09'はできないという認識なのでしょうか
can110

2018/12/12 16:48

そのような文字列を作る関数を自作すればよいです。 確認ですが、マイコン側に123というデータを送る場合は ASCII表現で「123」Hex表現で「313233」という3バイトを送ればよいということでしょうか?
zyoubutu

2018/12/12 16:53

123を送信しようとする場合 送信にはbytes型をHex表現で1byteずつb'\x31',b'\x32',b'\x33'というように3バイト送ればよいという状況です
can110

2018/12/12 16:55

なるほど。了解しました。
quickquip

2018/12/13 00:43

まだ全然わからないです。b'1' と b'\x31' は「同じ1バイトのデータ」ですよね。b'\t' と b'\x09' も「同じ1バイトのデータ」です。(b'1' == b'\x31' や b'\t' == b'\x09'、b'123' == b'\x31\x32\x33' がすべて真であることを確認してみてください)b'\t' を送るのと b'\x09' を送るのとで結果が変わるということはありえません。質問の「該当のソースコード」に問題があるようには見えません。単に人間が見て分かりづらいからデバッグ表示用として '\x09' と**表示**される関数が欲しいということでしょうか?
zyoubutu

2018/12/13 04:30

サイドマイコン側にデータを送信したところ意図した値を送れていました. 原因はマイコン側でリトルエンディアン・ビッグエンディアンを考慮していないことでした. 不適切な質問をしてしまい申し訳ありませんでした.
quickquip

2018/12/13 05:14

いいえ、質問はなにも不適切ではないです。hayataka2049さんの回答の1行目がもう正解だと感じたので、回答時間などを確認しないままこの欄に書いてしまいました。こちらこそ不適切だったかもしれません。
guest

回答2

0

データとしては正しく変換されています。printのとき、「asciiの範囲にあればasciiで表す」というルールで処理されるだけで。

python

1>>> (9).to_bytes(16, "big") 2b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\t' 3>>> (9).to_bytes(16, "big")[-1] 49

素直にbytesのまま送れば良い気もしますが、受信側で「バイナリデータ」ではなく「バイナリデータ表現風の文字列のバイナリ」を受け取らないといけない、というシチュエーションなのでしょうか?

投稿2018/12/12 20:03

hayataka2049

総合スコア30933

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

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

0

以下のようなto_hex(関数にてHEX表記文字列(str)を作り
それを.decode('ascii')でbytesに変換してやればよいと思います。
出力時、文字毎に「\x」をつけるべきかが不明なのですが、不要ならフォーマットをr'{:02X}'なりに調整ください。

Python

1def to_hex(data): 2 # 「\x」をつけるなど、フォーマットは受信側の仕様に合わせること 3 return ''.join([r'\x{:02X}'.format(b) for b in data]) 4 5# 元データ。確認表示 6b = b'123\t' 7print(b) # b'123\t' 8 9# Hex表記に変換 10s = to_hex(b) 11print(s) # \x31\x32\x33\x09 12 13# str->byteに変換。この処理もto_hex関数に含めてもよいが 14bs = s.encode('ascii') 15print(bs) # b'\x31\x32\x33\x09' print時「\」は「\」と表現されているだけ 16print(len(bs)) # 16

投稿2018/12/12 17:01

編集2018/12/12 17:09
can110

総合スコア38256

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問