首页 > 解决方案 > 将十进制数转换为字节大小的 8 位数组

问题描述

x = 64
var_in_bin_format = bin(64)
print(var_in_bin_format)

#Output
#0b1000000

#Desired Output -- > should always be in 8 bit format
#0b01000000

def call_another_api(var_in_bin_format):
    pass

在 Python 中,我需要调用一个 API,该 API 期望其参数始终为 8 位格式,而不管十进制数的值如何?

我在位操作方面不是那么好,所以我在想是否有什么我可以在这里做的?

我怎样才能做到这一点?我不能使用 format() 函数,因为它会将值转换为字符串表示形式,并且我正在调用的 API 会提醒我它的格式不正确。

标签: pythonpython-3.x

解决方案


即使你说你不能使用format(),因为它返回一个字符串,我还是要发布这个,因为这也是这样bin()做的。bin(x)相当于format(x, '#b')。我猜你没有添加'#',这意味着你不会有'0b'领先的价值。

Python 3 文档实际上给出了一个非常强烈的bin()提示,说明你可以如何做到这一点,format而不是使用。

如果您知道传递的值不会是负数,则可以使用格式字符串'#010b'

format(x, '#010b')

打破这个:

  • 'b'表示该数字将是一个字符串二进制表示。
  • '10'表示整个字符串将有 10 个字符长,两个用于 '0b', 8 个用于值。
  • '0'使它用'0'而不是填充' '
  • '#'将添加'0b'前缀,如bin().

请注意,这假定数字是 [0, 255] 范围内的整数。此范围之外的整数将生成有效的表示,但与预期的格式不匹配,并且可能具有前导'-'. 类型的对象float不能用'b'格式代码转换。考虑到您的预期输出,我认为这些都不是问题,但是ValueError如果值小于 0 或大于 255,则添加显式检查以抛出 a 可能是个好主意。


如果您使用的是 Python 3.6+,您还可以使用 f-strings:

f'{x:#010b}'

推荐阅读