我需要在 Python 中将左填充的 Int 6 字节(数量)转换为 BCD。
int = 145
expect = "\x00\x00\x00\x00\x01\x45"
我最接近的是这段代码(但它需要以字节对循环):
def TO_BCD(value):
return chr((((value / 10) << 4) & 0xF0) + ((value % 10) & 0x0F))
int = 145
TO_BCD(int) # => "\x00\x00\x00\x00\x01\x45" (expected)
最佳答案
这看起来相当简单,并且得到了您正在寻找的答案。只需隔离每对数字并转换为 ASCII。
如果我大量执行此操作,那么我可能会构建一个表(可能在 numpy 中),其中包含每个字节所有可能的 100 个值,并使用输入中的每对数字对其进行索引。
m = 145
print(''.join(f"\\x{m // 10**i % 10}{m // 10**(i-1) % 10}" for i in range(11, -1, -2)))
输出,虽然它只是一个字符串,而不是任何内部 BCD 表示
\x00\x00\x00\x00\x01\x45
同样,您可以将 BCD 打包成字节字符串。打印时,Python 会将 BCD 45
解释为大写 E
import struct
m = 145
packed = struct.pack('6B', *[(m // 10**i % 10 << 4) + (m // 10**(i-1) % 10) for i in range(11, -1, -2)])
print(packed)
print(''.join(f"\\{p:02x}" for p in packed))
输出
b'\x00\x00\x00\x00\x01E'
\00\00\00\00\01\45
关于python - 将金额 (int) 转换为 BCD,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57476837/