【问题标题】:calculate checksum hex in Python 3在 Python 3 中计算校验和十六进制
【发布时间】:2017-08-24 11:23:06
【问题描述】:

我想计算校验和。我想做的过程如下;

第一步

a="10F8000041303131303030353000000000000000"

第二步

10+F8+00+00+41+30+31+31+30+30+30+35+30+00+00+00+00+00+00+00 = D0

第三步

~D0 = 2F -> 2F + 1 = 30

我试过了;

def calc_checksum_two(s):        
return '%2X' % (-(sum(ord(c) for c in s) % 256) & 0xFF)
print(calc_checksum_two(a))

结果;

3D

【问题讨论】:

  • sum(ord(c) for c in s) 在我看来不合适。如果 s 是 "10F800",这给你 ord("1") + ord("0") + ord("F") + ord("8") + ord("0") + ord("0" )。我认为这与您想要做的事情并不接近。
  • 那么我怎样才能像“10+F8+00+...”一样逐字节求和

标签: python python-3.x hex ascii checksum


【解决方案1】:
b = [a[i:i+2] for i in range(0, len(a), 2)] # ['10', 'F8', '00', ...
c = [int(i, 16) for i in b] # [16, 248, 0, ...
d = 256 - sum(c) % 256 # 0x30
e = hex(d)[2:] # '30'

【讨论】:

  • e=hex(d) print(e) 结果; 0x30 谢谢乔恩 :)
  • 好吧,我最近尝试使用这个函数,我得到的校验和不正确,但也许我误解了它的用法——ChkSum = hex(sum(c)) 给了我原始值的校验和,但基本上改变了第 d 行——对此发表评论,以防其他人偶然发现并只需要原始校验和而不是增强校验和
【解决方案2】:

使用s="10F8000041303131303030353000000000000000sum(ord(c) for c in s) 将对每个字符的每个 ord 值求和。这将汇总[ord('1'), ord('0'), ord('F'), ...]。这不是你想要的。

要从该字符串构建字节数组,您应该使用:

[ a[i:i+2]] for i in range(0, len(a), 2) ]

这将创建一个像这样的数组:['10', 'F8', '00', ...]

然后将字符串 hex/base16 转换为整数使用 int(hex_string,16)

应该可以,但是功能在这里

def calc_checksum_two(a):
    return hex(((sum(int(a[i:i+2],16) for i in range(0, len(a), 2))%0x100)^0xFF)+1)[2:]

【讨论】:

    猜你喜欢
    • 2015-11-01
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-23
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多