python 把string的值当做16进制处理

一个string的,因为某种原因我们需要将它的值看成hex来处理。

这个问题的上下文是这样的。 我们公司有个一个APK Parser可以获取APK的属性,包括package Name, permissionName之类的,然后以XML文本的形式保存起来。这里出现了一些问题。就是APK的某些项包含特殊字符的时候,我们如果不作任何编码直接放在XML文件里面可能会由于特殊字符的干扰造成XML文件不被识别 (典型的特殊字符比如 ‘\’)。 于是我们的工程师就对所有的文本进行来了一次utf-16-le (UTF-16-LITTLE-ENDIAN)的编码。然后在XML里面的字符串以编码后的16进制raw string来代替。e.g: 63006f006d002e006600370032003900300077006500690072002e0065006c00730066006b002e0074007800 表示com.f7290weir.elsfk.tx

但是我现在需要对这个已经编码后的16进制字符串进行解析,进行一个逆向工程来得到原文。

str = 63006f006d002e006600370032003900300077006500690072002e0065006c00730066006b002e0074007800
print decode(str,'uft16')
>> ㌶〰昶〰搶〰攲〰㘶〰㜳〰㈳〰㤳〰〳〰㜷〰㔶〰㤶〰㈷〰攲〰㔶〰挶〰㌷〰㘶〰戶〰攲〰㐷〰㠷〰

用以上方法明显行不通。 因为我们是以little endian的方式编码的,所以相对而言也需要以同样的方式解码。

str = 63006f006d002e006600370032003900300077006500690072002e0065006c00730066006b002e0074007800
print decode(str,'uft_16_el')
>>㌶〰昶〰搶〰攲〰㘶〰㜳〰㈳〰㤳〰〳〰㜷〰㔶〰㤶〰㈷〰攲〰㔶〰挶〰㌷〰㘶〰戶〰攲〰㐷〰㠷〰
使用了little-endian任然有问题。在这个问题上我想到应该是由于我们的str并没有被认为是16进制的值,从而我们decode的对象实际上是string化的这么一长串数字。

这个问题如何解决呢。对每两位前面加一个"\x"是我们最容易想到的。

a = "63006f006d002e006600370032003900300077006500690072002e0065006c00730066006b002e0074007800"
retval = ''

for i in range ( 0, len( a ) / 2 ):
    retval = retval + '\x' + a[i * 2] + a[i * 2 + 1]

print [retval]
>>ValueError: invalid \x escape


很遗憾这个方法不行。 在我们写下面那段代码的时候python就已经无法忍受的报错了。

+ '\x' + 
这很可以理解,python解释器无法认同''\x" 这种类型的空串。但是如果这不行的话我们还能有什么方法表达String的值为16进制码呢。

其实很简单,因为它是一个表示16进制的字符串。换句话说它也就是经过16进制编码过一次的string串儿。我们直接对它进行一次hex的解码就行了。

a = "63006f006d002e006600370032003900300077006500690072002e0065006c00730066006b002e0074007800"
print a.decode( 'hex' ).decode( 'utf_16_le' )


就这么简单。

### 回答1: 可以使用Python内置的binascii模块来将字符串转换为16进制数。具体方法如下: ``` import binascii # 将字符串转换为字节串 byte_str = str.encode('utf-8') # 将字节串转换为16进制数 hex_str = binascii.hexlify(byte_str) # 将16进制数转换回字符串 new_str = binascii.unhexlify(hex_str).decode('utf-8') print(hex_str) print(new_str) ``` 其中,`str.encode('utf-8')`用于将字符串转换为字节串,`binascii.hexlify(byte_str)`用于将字节串转换为16进制数,`binascii.unhexlify(hex_str).decode('utf-8')`用于将16进制数转换回字符串。 ### 回答2: Python中,可以使用内置的函数`hex()`将一个字符串转换为十六进制表示。以下是一个示例代码: ```python s = "Hello, World!" hex_str = "".join([hex(ord(c))[2:] for c in s]) print(hex_str) ``` 在上面的代码中,我们将字符串`s`初始化为`"Hello, World!"`,然后使用一个列表推导式,遍历字符串中的每个字符。对于每个字符,我们使用`ord()`函数将其转换为ASCII码,然后使用`hex()`函数将ASCII码转换为十六进制表示。由于`hex()`函数返回的结果是带有前缀`0x`的字符串,所以我们使用切片操作`[2:]`将前缀去掉。最后,我们使用`"".join()`函数将所有字符连接在一起,并将结果赋给变量`hex_str`。最后,我们打印出`hex_str`的。 以上代码的输出结果为:`48656c6c6f2c20576f726c6421`。 使用`hex()`函数是将字符串转换为十六进制表示的一种简单方法。注意,输出结果是字符串类型。如果想要得到十六进制的整数,可以使用`int()`函数进行转换。 ### 回答3: 在Python中,我们可以使用内置函数`hex()`将字符串转换为十六进制。 要将字符串转换为十六进制,您可以使用以下步骤: 1. 首先,我们需要一个字符串,例如`string = "Hello World!"`。 2. 然后,我们可以使用`hex()`函数将字符串转换为十六进制。例如,`hex_string = hex(int.from_bytes(string.encode(), 'big')).lstrip("0x").rstrip("L")`。 让我们解释一下这个步骤: - `string.encode()`将字符串编码为字节数组。 - `int.from_bytes(bytes, byteorder)`将字节数组作为参数,并根据给定的字节顺序(byteorder)返回一个整数。 - `hex(int)`将整数转换为十六进制字符串。 - `lstrip("0x")`删除十六进制字符串开头的"0x"。 - `rstrip("L")`删除末尾可能包含的"L"。 3. 最后,我们可以将结果打印出来,例如`print(hex_string)`。 完整的代码如下: ```python string = "Hello World!" hex_string = hex(int.from_bytes(string.encode(), 'big')).lstrip("0x").rstrip("L") print(hex_string) ``` 运行上述代码,将输出字符串`"Hello World!"`的十六进制表示。 注意:此方法将每个字符的ASCII码转换为十六进制。如果您想将整个字符串转换为一个十六进制数,您可以使用`string.encode().hex()`代替`hex(int.from_bytes(string.encode(), 'big')).lstrip("0x").rstrip("L")`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值