PythonでCRC-16のサンプルプログラムがありましたので
VBAでコンバートさせました。しかしながら以下のエラーが発生いたします。
「For Eachは、コレクションオブジェクトまたは配列でのみ繰り返しを実行します。」
また、"\x01\x04\x00\x00\x00\x01"を1バイトずつ取得したいのですが
inputdataには、10進数の値が入ります。(1310721)
どこを改善すればよろしいでしょうか
crc = &HFFFFも失敗
crcがbyte型なので16bitの初期化ができないし
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)
VBA
1 2'CRC16計算 3Private Sub CommandButton1_Click() 4 Dim anser As Byte 5 Dim inputdata As Long 6 7 'b"\x01\x04\x00\x00\x00\x01" 8 inputdata = &H140001 9 anser = CRC16_Calculate(inputdata) 10 11End Sub 12 13 14'CRC-16 15Public Function CRC16_Calculate(ByVal str As Long) As Byte 16 Dim crc As Byte 17 Dim i As Integer 18 Dim DecByte As Byte 19 Dim tmp As Byte 20 21 crc = &HFFFF 22 ibm16 = &HA001 23 24 For Each cel In str 25 DecByte = cel.Value 26 tmp = crc Xor DecByte 27 28 For i = 1 To 8 29 '1ビット目の比較 30 If ((tmp And &H1) = 1) Then 31 '右に1bitシフト 32 tmp = tmp \ (2 ^ 1) 33 i = i + 1 34 tmp = ibm16 Xor tmp 35 Else 36 tmp = tmp \ (2 ^ 1) 37 i = i + 1 38 End If 39 40 Next 41 CRC16_Calculate = tmp 42 Next 43 44End Function 45
回答1件
あなたの回答
tips
プレビュー