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

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

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

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

Q&A

解決済

1回答

2768閲覧

CRC-16 (Modbus)

pokemonta

総合スコア170

Python

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

0グッド

0クリップ

投稿2020/04/16 05:08

以下のサイトで、
010400000001を入力して、Hexチェックに入れて出力すると
CRC-16 (Modbus) 0xCA31という結果が出力されます。
リンク内容

一方で以下のサイトを参考に
プログラムを実行しても同様の結果にはなりませんでした。
リンク内容

python

1# -*- coding: utf-8 -*- 2 3# エラーチェック以外のクエリ 4command = b"\x01\x04\x00\x00\x00\x01" 5 6# 最初のCRCレジスタ値をFFFFhに設定 7crc_registor = 0xFFFF 8for data_byte in command: 9 # CRCレジスタとデータバイトのXOR 10 tmp = crc_registor ^ data_byte 11 # シフト回数を記憶 12 shift_num = 0 13 # シフトが 8回になるまで繰り返す 14 while(shift_num < 8): 15 if(tmp&1 == 1): # 桁あふれが1なら 16 tmp = tmp >> 1 17 shift_num += 1 18 tmp = 0xA001 ^ tmp 19 else: 20 tmp = tmp >> 1 21 shift_num += 1 22 # 計算結果をcrc_registorにセット 23 crc_registor = tmp 24# 計算結果をbytes型へ変換 25crc = crc_registor.to_bytes(2, 'big') 26 27# 結果を表示 28print(crc)

b'\xca1'

同じ結果(0xCA31)を得るためにはどうすればよいでしょうか?

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

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

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

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

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

guest

回答1

0

ベストアンサー

それ、正しい結果になってます

\xca と、文字の'1'ということですが、
'1'は\x31ですんで、b'\xca\x31' を表してます

投稿2020/04/16 05:12

y_waiwai

総合スコア88042

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

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

pokemonta

2020/04/16 05:13

おっしゃる通りです。 crc_registor.to_bytesではなく、16進で出力できれば結果が一致しそうです。 やりかたわからないですが。。。
y_waiwai

2020/04/16 05:29

print(crc) してるからややこしくなるんで、 print(crc.hex()) すると、ca31 とでてきます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問