if item.text(0)== "Raw(原始数据)": for name, value in layer.fields.items(): if str(name) == "load": self.ui.Binary_text.setText(hexdump(value, dump=True)) print((hexdump(value, dump=True))) sadf = (str(value))[2:-1] #print(sadf) binary_bytes = bytes.fromhex(sadf) decoded_str = binary_bytes.decode('utf-8') print(decoded_str) #print(str(int(hexdump(value, dump=True), 16))) return上述代码中layer是packet的数据包,运行报错:binary_bytes = bytes.fromhex(sadf) ValueError: non-hexadecimal number found in fromhex() arg at position 0 。请问报错的原因是什么以及如何修改。另外请问如何修改或优化代码。可以使value的值转换成可以看懂的字符串?
时间: 2023-12-31 18:06:02 浏览: 134
BilinearInter.zip_RAW 插值_raw图像 matlab_raw格式_site:www.pudn.com_插值
5星 · 资源好评率100%
报错的原因是 "sadf" 不是一个合法的十六进制字符串,所以无法通过 `bytes.fromhex()` 方法将其转换为字节序列。你可以在调用 `bytes.fromhex()` 之前添加一个判断语句,检查字符串是否为合法的十六进制字符串。
以下是修改后的代码:
```
if item.text(0) == "Raw(原始数据)":
for name, value in layer.fields.items():
if str(name) == "load":
try:
binary_bytes = bytes.fromhex(value)
decoded_str = binary_bytes.decode('utf-8')
self.ui.Binary_text.setText(hexdump(value, dump=True))
print(hexdump(value, dump=True))
print(decoded_str)
except ValueError:
print("Invalid hexadecimal string")
```
对于如何优化代码,你可以将 `self.ui.Binary_text.setText()` 方法的调用挪到 try 块中,这样只有在 value 是合法的十六进制字符串时才会更新文本框,代码如下:
```
if item.text(0) == "Raw(原始数据)":
for name, value in layer.fields.items():
if str(name) == "load":
try:
binary_bytes = bytes.fromhex(value)
decoded_str = binary_bytes.decode('utf-8')
print(hexdump(value, dump=True))
print(decoded_str)
self.ui.Binary_text.setText(hexdump(value, dump=True))
except ValueError:
print("Invalid hexadecimal string")
```
此外,你也可以使用 `binascii` 模块中的 `unhexlify` 方法将十六进制字符串转换为字节序列,不需要使用 `bytes.fromhex()` 方法。修改后的代码如下:
```
import binascii
if item.text(0) == "Raw(原始数据)":
for name, value in layer.fields.items():
if str(name) == "load":
try:
binary_bytes = binascii.unhexlify(value)
decoded_str = binary_bytes.decode('utf-8')
print(hexdump(value, dump=True))
print(decoded_str)
self.ui.Binary_text.setText(hexdump(value, dump=True))
except binascii.Error:
print("Invalid hexadecimal string")
```
这段代码的输出结果与之前的代码相同,但使用 `binascii.unhexlify()` 方法可以使代码更简洁易读。
阅读全文