【问题标题】:Got unicode error when send string parameter over D-Bus通过 D-Bus 发送字符串参数时出现 unicode 错误
【发布时间】:2015-12-25 22:44:45
【问题描述】:

我尝试使用 python dbus 模块连接到 WEP 安全 WiFi

我填写网络配置字典如下:

nw_config['wep_key0'] = binascii.unhexlify(mypassword)

我的密码是十六进制字符串

当mypassword设置为'12345678'时不会出错,但是当输入英文字母如a、b、c、d、e、f时。

例如:

nw_config['wep_key0'] = binascii.unhexlify('abcdef')

会出现如下错误

UnicodeError:要通过 D-Bus 发送的字符串参数必须是有效的 UTF-8,并且没有非字符代码点

只是不明白这两种情况有什么区别,因为它们都应该是有效的十六进制字符串?

更新:dbus相关代码

args = dbus.Dictionary(nw_config)
bus = dbus.SystemBus()
wpas_obj = bus.get_object(WPAS_DBUS_SERVICE, WPAS_DBUS_PATH)
wpas = dbus.Interface(wpas_obj, WPAS_DBUS_SERVICE)
if_obj = bus.get_object(WPAS_DBUS_SERVICE, path)
path = wpas.GetInterface(if_obj, WPAS_DBUS_IFACE)
network = iface.AddNetwork(args)    # this line has problem

【问题讨论】:

  • mypassword 是什么数据?是ASCII吗?还是 ASCII 编码的十六进制?
  • 我认为是ASCII编码的十六进制

标签: python unicode hex ascii wep


【解决方案1】:

所有字母,以及十六进制数字 8 和 9 都设置了最高位。当这发生在字节的高半字节时,该字节只能是多字节 UTF-8 序列的一部分。查看有关 UTF-8 的 Wikipedia 文章以获得进一步的解释。

现在,并非每个字节序列都是有效的 UTF-8,而且您的数据也可能不是。您的代码也无济于事,因为它不包含您尝试解码的文件中的数据。你应该可以用这样的方式重现它:

data = '0123456789abcdef'
bytes = unhexlify(data)
string = bytes.decode('UTF-8')

你应该在第三行得到错误。

【讨论】:

  • 确实,我可以通过您提供的代码进行复制。但这会很奇怪......因为所有十六进制密钥都应该作为 WEP 的密钥有效?
  • 如果密钥有效,为什么要在它们上使用unhexlify()?也许这就是问题所在!
  • 实际上我已经阅读了以下链接:lists.shmoo.com/pipermail/hostap/2009-February/019326.html 此链接描述了 WEP 密钥必须转换为二进制数据,因此我通过 unhexlify 将十六进制字符串转换为二进制。我还设置了WEP密钥为12345678,用hex-key.unhexlify()测试,就可以成功连接WiFi了。
  • 很好的研究,那篇文章包含了您问题的解决方案!至少它可能会,我还没有实际测试过。
  • 是的,我试过了。但正如我之前所说,这不适用于包含 a、b、c、d、e、f 的 WEP 密钥。还是不知道为什么。
【解决方案2】:

感谢@Ulrich Eckhardt 的帮助。

假设您有一个名为 pw 的十六进制字符串 wep 密钥。 然后您必须执行以下操作才能在 dbus 中成功传输此密钥:

dbus.ByteArray(pw.decode('hex'))

【讨论】:

    猜你喜欢
    • 2013-01-16
    • 1970-01-01
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-12-23
    相关资源
    最近更新 更多