python - 将金额 (int) 转换为 BCD

标签 python bcd

我需要在 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/

相关文章:

python - 我的神经网络有什么问题,它给出了错误的预测

python - 在 Python 中将单行字符串转换为整数数组

python - Pandas:将分类变量的值映射到预定义的虚拟列列表

c++ - 将 Unsigned Int 转换为 BCD

assembly - ASCII 调整和十进制调整指令如何工作?

python - Pandas 转换日期时间格式

python - 在生产模式下从服务站点在 Django 中设置静态文件

performance - 将BCD打包到DPD : How to improve this amd64 assembly routine?

digital - 将六位二进制数转换为对应的两位BCD数?

arduino - BCD转十进制和十进制转BCD