查看字节真实二进制形式示例解析1
查看字节的真实二进制形式?
若需要显式查看二进制0/1,可以通过以下方法转换:
方法1:逐字节转换为二进制字符串
def bytes_to_binary(data: bytes) -> str:return ' '.join([bin(byte)[2:].zfill(8) for byte in data])# 示例
bytes_data = "你好".encode("utf-8") # b'\xe4\xbd\xa0\xe5\xa5\xbd'
binary_str = bytes_to_binary(bytes_data)
print(binary_str)
# 输出: 11100100 10111101 10100000 11100101 10100101 10111101
功能说明
该函数将输入的 字节流(bytes) 转换为一个由 8 位二进制字符串 组成的序列,每个二进制字符串之间用空格分隔。例如:
输入 b'\xe4\xbd'
会转换为 11100100 10111101
。
代码逐行解析
1. bin(byte)[2:]
- 作用:将单个字节(整数)转换为二进制字符串,并去掉前缀
0b
。 - 示例:
byte = 0xe4 # 十进制为 228 bin(byte) # 输出: '0b11100100' bin(byte)[2:] # 输出: '11100100'
2. .zfill(8)
- 作用:将二进制字符串填充到 8 位(不足 8 位时左侧补零)。
- 示例:
bin(3)[2:] # 输出: '11'(二进制为 0b11) bin(3)[2:].zfill(8) # 输出: '00000011'
3. 列表推导式 [ ... for byte in data]
- 作用:遍历字节流
data
中的每个字节,逐个转换为 8 位二进制字符串。 - 示例:
data = b'\xe4\xbd' # 字节流包含两个字节:0xe4 (228), 0xbd (189) [bin(byte)[2:].zfill(8) for byte in data] # 输出: ['11100100', '10111101']
4. ' '.join(...)
- 作用:将列表中的二进制字符串用空格连接成一个完整字符串。
- 示例:
['11100100', '10111101'] → '11100100 10111101'
示例运行过程
bytes_data = "你好".encode("utf-8") # 编码为字节流: b'\xe4\xbd\xa0\xe5\xa5\xbd'
binary_str = bytes_to_binary(bytes_data)
print(binary_str)
# 输出: 11100100 10111101 10100000 11100101 10100101 10111101
步骤分解
- 编码字符串:
- “你好” 的 UTF-8 编码为 6 个字节:
0xe4, 0xbd, 0xa0, 0xe5, 0xa5, 0xbd
。
- “你好” 的 UTF-8 编码为 6 个字节:
- 逐个字节处理:
字节(十六进制) 十进制值 二进制(补零到 8 位) 0xe4
228 11100100
0xbd
189 10111101
0xa0
160 10100000
0xe5
229 11100101
0xa5
165 10100101
0xbd
189 10111101
- 拼接结果:
将上述二进制字符串用空格连接,得到最终输出。
关键特性
- 填充保证:确保每个二进制字符串长度为 8 位,符合字节的固定长度特性。
- 可读性:用空格分隔二进制字符串,便于观察每个字节的细节。
- 兼容性:适用于任意字节流(如图片、加密数据等)。
应用场景
- 调试网络协议:查看原始字节流的二进制形式。
- 数据加密/编码:分析二进制级别的数据变换。
- 硬件交互:处理需要精确控制二进制的设备(如串口设备)。