【问题标题】:Hex to String convertion十六进制到字符串的转换
【发布时间】:2019-07-30 02:27:24
【问题描述】:

我有一个这样的字符串:

message='भी मिलता था। सरोपा #variable# भेंट करना अब शायद सिर्फ सिख परंपरा में ही बचा समाज की #variable# गहराई नापते रहे हैं गुणाधर'

我已将此字符串转换为十六进制使用

output = ''.join(hex(ord(c)) for c in message) 

output1 = output.replace('0x','0')

最后的十六进制是:

'092d0940020092e093f09320924093e0200925093e096402009380930094b092a093e02002307606107206906106206c065023020092d09470902091f020091509300928093e0200905092c0200936093e092f09260200938093f0930094d092b0200938093f0916020092a09300902092a0930093e020092e0947090202009390940020092c091a093e0200938092e093e091c0200915094002002307606107206906106206c065023020091709390930093e09080200928093e092a09240947020093009390947020093909480902020091709410923093e09270930'

如何从编码的十六进制中取回我的原始字符串?

或者我怎样才能从输出中取回我的原始字符串(不替换)?

【问题讨论】:

标签: python python-3.x


【解决方案1】:

binascii 库已经有十六进制编码和编码功能

import binascii

message='भी मिलता था। सरोपा #variable# भेंट करना अब शायद सिर्फ सिख परंपरा में ही बचा समाज की #variable# गहराई नापते रहे हैं गुणाधर'
messageEncoded = binascii.hexlify(message.encode())
print(messageEncoded)

messageDecoded =  binascii.unhexlify(messageEncoded)
print(messageDecoded.decode())

【讨论】:

  • 我想像上面仅十六进制代码( '092d0940020092e093f09320924093e0200925093e096402009380930094b092a093e02002307606107206906106206c065023020092d09470902091f020091509300928093e0200905092c0200936093e092f09260200938093f0930094d092b0200938093f0916020092a09300902092a0930093e020092e0947090202009390940020092c091a093e0200938092e093e091c0200915094002002307606107206906106206c065023020091709390930093e09080200928093e092a09240947020093009390947020093909480902020091709410923093e09270930')跨度>
  • 对于案例 2:不替换我如何取回我的原始字符串?
【解决方案2】:

正如一些评论已经指出的那样,如果将0x替换为0,则无法解码,我能得到的最接近的是以下

# Deencoding
hexs = []
tmp = ''
for i in range(len(output1)):
    if i < len(output1) - 1 and output1[i] == '0' and output1[i+1] != '0':
        hexs.append(tmp)
        tmp = ''
    else:
        tmp += output1[i]
if tmp != '':
    hexs.append(tmp)

print(''.join(chr(int(c,16)) for c in hexs[1:]))

哪一个会失败,因为在你的十六进制代码中有902,你如何确定它是2个字符92还是只有一个902

如果您可以保留0x,您可以简单地使用其他命令将其与intchr 取回,如下所示

print(''.join(chr(int(c, 16)) for c in output[2:].split('0x')))

但是做你想做的最好的方法可能是使用binascii

【讨论】:

  • 谢谢,输出效果很好。让我也检查一下 output1。
  • @VaniPolnedi 它不起作用 :( 一些字符是错误的,因为无法区分 20929 不幸的是,它足够接近但不是一样的^^
  • 我可以从 output1 取回我的输出吗?
  • 在我的代码中我有 902,它只确定一个 902 而不是 2 个字符
  • 我同意。但是你不能确定一个没有硬编码的逻辑分割成一些零而不是全部(这意味着你怎么能告诉计算机“20902”是“2 902”而不是“209 2”?
猜你喜欢
  • 2012-01-24
  • 2020-11-07
  • 1970-01-01
  • 2013-09-05
  • 2021-03-19
  • 2016-12-27
  • 1970-01-01
相关资源
最近更新 更多