如何将十六进制字符转换为普通字符?

如何将十六进制字符转换为普通字符?

我尝试过,但我陷入了“转义”“sed”的困境:

sed -i 's/\\x0/NUL/g' $1
sed -i 's/\\x1/SOH/g' $1
sed -i 's/\\x2/STX/g' $1
sed -i 's/\\x3/ETX/g' $1
sed -i 's/\\x4/EOT/g' $1
sed -i 's/\\x5/ENQ/g' $1
sed -i 's/\\x6/ACK/g' $1
sed -i 's/\\x7/BEL/g' $1
sed -i 's/\\x8/BS/g' $1
sed -i 's/\\x9/HT/g' $1
sed -i 's/\\x0A/LF/g' $1
sed -i 's/\\x0B/VT/g' $1
sed -i 's/\\x0C/FF/g' $1
sed -i 's/\\x0D/CR/g' $1
sed -i 's/\\x0E/SO/g' $1
sed -i 's/\\x0F/SI/g' $1
sed -i 's/\\x10/DLE/g' $1
sed -i 's/\\x11/DC1/g' $1
sed -i 's/\\x12/DC2/g' $1
sed -i 's/\\x13/DC3/g' $1
sed -i 's/\\x14/DC4/g' $1
sed -i 's/\\x15/NAK/g' $1
sed -i 's/\\x16/SYN/g' $1
sed -i 's/\\x17/ETB/g' $1
sed -i 's/\\x18/CAN/g' $1
sed -i 's/\\x19/EM/g' $1
sed -i 's/\\x1A/SUB/g' $1
sed -i 's/\\x1B/ESC/g' $1
sed -i 's/\\x1C/FS/g' $1
sed -i 's/\\x1D/GS/g' $1
sed -i 's/\\x1E/RS/g' $1
sed -i 's/\\x1F/US/g' $1
sed -i 's/\\x20//g' $1
sed -i 's/\\x21/!/g' $1
sed -i 's/\\x22/"/g' $1
sed -i 's/\\x23/#/g' $1
sed -i 's/\\x24/$/g' $1
sed -i 's/\\x25/%/g' $1
sed -i 's/\\x26/&/g' $1
sed -i 's/\\x27'/g' $1
sed -i 's/\\x28/(/g' $1
sed -i 's/\\x29/)/g' $1
sed -i 's/\\x2A/*/g' $1
sed -i 's/\\x2B/0/g' $1
sed -i 's/\\x2C/,/g' $1
sed -i 's/\\x2D/0/g' $1
sed -i 's/\\x2E/0/g' $1
sed -i 's/\\x2F///g' $1
sed -i 's/\\x30/0/g' $1
sed -i 's/\\x31/1/g' $1
sed -i 's/\\x32/2/g' $1
sed -i 's/\\x33/3/g' $1
sed -i 's/\\x34/4/g' $1
sed -i 's/\\x35/5/g' $1
sed -i 's/\\x36/6/g' $1
sed -i 's/\\x37/7/g' $1
sed -i 's/\\x38/8/g' $1
sed -i 's/\\x39/9/g' $1
sed -i 's/\\x3A/:/g' $1
sed -i 's/\\x3B/;/g' $1
sed -i 's/\\x3C/</g' $1
sed -i 's/\\x3D/=/g' $1
sed -i 's/\\x3E/>/g' $1
sed -i 's/\\x3F/?/g' $1
sed -i 's/\\x40/@/g' $1
sed -i 's/\\x41/A/g' $1
sed -i 's/\\x42/B/g' $1
sed -i 's/\\x43/C/g' $1
sed -i 's/\\x44/D/g' $1
sed -i 's/\\x45/E/g' $1
sed -i 's/\\x46/F/g' $1
sed -i 's/\\x47/G/g' $1
sed -i 's/\\x48/H/g' $1
sed -i 's/\\x49/I/g' $1
sed -i 's/\\x4A/J/g' $1
sed -i 's/\\x4B/K/g' $1
sed -i 's/\\x4C/L/g' $1
sed -i 's/\\x4D/M/g' $1
sed -i 's/\\x4E/N/g' $1
sed -i 's/\\x4F/O/g' $1
sed -i 's/\\x50/P/g' $1
sed -i 's/\\x51/Q/g' $1
sed -i 's/\\x52/R/g' $1
sed -i 's/\\x53/S/g' $1
sed -i 's/\\x54/T/g' $1
sed -i 's/\\x55/U/g' $1
sed -i 's/\\x56/V/g' $1
sed -i 's/\\x57/W/g' $1
sed -i 's/\\x58/X/g' $1
sed -i 's/\\x59/Y/g' $1
sed -i 's/\\x5A/Z/g' $1
sed -i 's/\\x5B/[/g' $1
sed -i 's/\\x5C/\/g' $1
sed -i 's/\\x5D/]/g' $1
sed -i 's/\\x5E/^/g' $1
sed -i 's/\\x5F/_/g' $1
sed -i 's/\\x60/`/g' $1
sed -i 's/\\x61/a/g' $1
sed -i 's/\\x62/b/g' $1
sed -i 's/\\x63/c/g' $1
sed -i 's/\\x64/d/g' $1
sed -i 's/\\x65/e/g' $1
sed -i 's/\\x66/f/g' $1
sed -i 's/\\x67/g/g' $1
sed -i 's/\\x68/h/g' $1
sed -i 's/\\x69/i/g' $1
sed -i 's/\\x6A/j/g' $1
sed -i 's/\\x6B/k/g' $1
sed -i 's/\\x6C/l/g' $1
sed -i 's/\\x6D/m/g' $1
sed -i 's/\\x6E/n/g' $1
sed -i 's/\\x6F/o/g' $1
sed -i 's/\\x70/p/g' $1
sed -i 's/\\x71/q/g' $1
sed -i 's/\\x72/r/g' $1
sed -i 's/\\x73/s/g' $1
sed -i 's/\\x74/t/g' $1
sed -i 's/\\x75/u/g' $1
sed -i 's/\\x76/v/g' $1
sed -i 's/\\x77/w/g' $1
sed -i 's/\\x78/x/g' $1
sed -i 's/\\x79/y/g' $1
sed -i 's/\\x7A/z/g' $1
sed -i 's/\\x7B/{/g' $1
sed -i 's/\\x7C/|/g' $1
sed -i 's/\\x7D/}/g' $1
sed -i 's/\\x7E/~/g' $1
sed -i 's/\\x7F//g' $1
sed -i 's/\\x80/€/g' $1
sed -i 's/\\x81//g' $1
sed -i 's/\\x82/‚/g' $1
sed -i 's/\\x83/ƒ/g' $1
sed -i 's/\\x84/„/g' $1
sed -i 's/\\x85/…/g' $1
sed -i 's/\\x86/†/g' $1
sed -i 's/\\x87/‡/g' $1
sed -i 's/\\x88/ˆ/g' $1
sed -i 's/\\x89/‰/g' $1
sed -i 's/\\x8A/Š/g' $1
sed -i 's/\\x8B/‹/g' $1
sed -i 's/\\x8C/Œ/g' $1
sed -i 's/\\x8D//g' $1
sed -i 's/\\x8E/Ž/g' $1
sed -i 's/\\x8F//g' $1
sed -i 's/\\x90//g' $1
sed -i 's/\\x91/‘/g' $1
sed -i 's/\\x92/’/g' $1
sed -i 's/\\x93/“/g' $1
sed -i 's/\\x94/”/g' $1
sed -i 's/\\x95/•/g' $1
sed -i 's/\\x96/–/g' $1
sed -i 's/\\x97/—/g' $1
sed -i 's/\\x98/˜/g' $1
sed -i 's/\\x99/™/g' $1
sed -i 's/\\x9A/š/g' $1
sed -i 's/\\x9B/›/g' $1
sed -i 's/\\x9C/œ/g' $1
sed -i 's/\\x9D//g' $1
sed -i 's/\\x9E/ž/g' $1
sed -i 's/\\x9F/Ÿ/g' $1
sed -i 's/\\xA0//g' $1
sed -i 's/\\xA1/¡/g' $1
sed -i 's/\\xA2/¢/g' $1
sed -i 's/\\xA3/£/g' $1
sed -i 's/\\xA4/¤/g' $1
sed -i 's/\\xA5/¥/g' $1
sed -i 's/\\xA6/¦/g' $1
sed -i 's/\\xA7/§/g' $1
sed -i 's/\\xA8/¨/g' $1
sed -i 's/\\xA9/©/g' $1
sed -i 's/\\xAA/ª/g' $1
sed -i 's/\\xAB/«/g' $1
sed -i 's/\\xAC/¬/g' $1
sed -i 's/\\xAD//g' $1
sed -i 's/\\xAE/®/g' $1
sed -i 's/\\xAF/¯/g' $1
sed -i 's/\\xB0/°/g' $1
sed -i 's/\\xB1/±/g' $1
sed -i 's/\\xB2/²/g' $1
sed -i 's/\\xB3/³/g' $1
sed -i 's/\\xB4/´/g' $1
sed -i 's/\\xB5/µ/g' $1
sed -i 's/\\xB6/¶/g' $1
sed -i 's/\\xB7/·/g' $1
sed -i 's/\\xB8/¸/g' $1
sed -i 's/\\xB9/¹/g' $1
sed -i 's/\\xBA/º/g' $1
sed -i 's/\\xBB/»/g' $1
sed -i 's/\\xBC/¼/g' $1
sed -i 's/\\xBD/½/g' $1
sed -i 's/\\xBE/¾/g' $1
sed -i 's/\\xBF/¿/g' $1
sed -i 's/\\xC0/À/g' $1
sed -i 's/\\xC1/A/g' $1
sed -i 's/\\xC2/Â/g' $1
sed -i 's/\\xC3/Ã/g' $1
sed -i 's/\\xC4/Ä/g' $1
sed -i 's/\\xC5/Å/g' $1
sed -i 's/\\xC6/Æ/g' $1
sed -i 's/\\xC7/Ç/g' $1
sed -i 's/\\xC8/È/g' $1
sed -i 's/\\xC9/E/g' $1
sed -i 's/\\xCA/Ê/g' $1
sed -i 's/\\xCB/Ë/g' $1
sed -i 's/\\xCC/Ì/g' $1
sed -i 's/\\xCD/I/g' $1
sed -i 's/\\xCE/Î/g' $1
sed -i 's/\\xCF/Ï/g' $1
sed -i 's/\\xD0/Ð/g' $1
sed -i 's/\\xD1/Ñ/g' $1
sed -i 's/\\xD2/Ò/g' $1
sed -i 's/\\xD3/O/g' $1
sed -i 's/\\xD4/Ô/g' $1
sed -i 's/\\xD5/Õ/g' $1
sed -i 's/\\xD6/O/g' $1
sed -i 's/\\xD7/×/g' $1
sed -i 's/\\xD8/Ø/g' $1
sed -i 's/\\xD9/Ù/g' $1
sed -i 's/\\xDA/U/g' $1
sed -i 's/\\xDB/Û/g' $1
sed -i 's/\\xDC/U/g' $1
sed -i 's/\\xDD/Ý/g' $1
sed -i 's/\\xDE/Þ/g' $1
sed -i 's/\\xDF/ß/g' $1
sed -i 's/\\xE0/à/g' $1
sed -i 's/\\xE1/a/g' $1
sed -i 's/\\xE2/â/g' $1
sed -i 's/\\xE3/ã/g' $1
sed -i 's/\\xE4/ä/g' $1
sed -i 's/\\xE5/å/g' $1
sed -i 's/\\xE6/æ/g' $1
sed -i 's/\\xE7/ç/g' $1
sed -i 's/\\xE8/è/g' $1
sed -i 's/\\xE9/e/g' $1
sed -i 's/\\xEA/ê/g' $1
sed -i 's/\\xEB/ë/g' $1
sed -i 's/\\xEC/ì/g' $1
sed -i 's/\\xED/i/g' $1
sed -i 's/\\xEE/î/g' $1
sed -i 's/\\xEF/ï/g' $1
sed -i 's/\\xF0/ð/g' $1
sed -i 's/\\xF1/ñ/g' $1
sed -i 's/\\xF2/ò/g' $1
sed -i 's/\\xF3/o/g' $1
sed -i 's/\\xF4/ô/g' $1
sed -i 's/\\xF5/õ/g' $1
sed -i 's/\\xF6/o/g' $1
sed -i 's/\\xF7/÷/g' $1
sed -i 's/\\xF8/ø/g' $1
sed -i 's/\\xF9/ù/g' $1
sed -i 's/\\xFA/u/g' $1
sed -i 's/\\xFB/û/g' $1
sed -i 's/\\xFC/u/g' $1
sed -i 's/\\xFD/ý/g' $1
sed -i 's/\\xFE/þ/g' $1
sed -i 's/\\xFF/\ÿ/g' $1

如何创建十六进制代码到普通字符转换器?所以如果我运行:

sh thementionedscript.sh hexstrings.txt

-->> hexstrings.txt 中的所有十六进制字符都应转换为普通字符,例如:之前:

\x68\x69

后:

hi

答案1

bash

#!/bin/bash

while IFS= read -r line; do
    printf "$line"
done

IFS=需要阻止 IFS 剥离发生,也就是说,在大多数情况下(IFS 包含空格,这是常态)如果您不将 IFS 设为空,则"${line}"无论您引用的事实如何,空格都会从每一侧被剥离它。-r读取选项会停止退格解释。

请记住,这也将解释源代码中可能存在的其他转义代码。如果您担心这个问题,请逐个字符地读取文件,并仅让 printf 作用于 \x 转义码。

你应该总是使用临时文件,因此运行它如下:

./foo < myfile > mytempfile && mv mytempfile myfile

另外,不要使用sed -i它来编辑文件,它不可移植,而且即使在不同的实现中,语法也会有所不同(例如,您的代码在 Mac OSX 和大多数 BSD 上将失败)。ed是编辑文件的更好选择。

答案2

在bash中?

#!/bin/bash

while IFS= read line
 do
 echo -e "$line"
done

答案3

这是对这个问题的新看法......

要用来sed进行更改,您已经完成了 97%。
以下是让它发挥作用的一些基本点和一些可选点。

  • 让所有模式不区分大小写可能很有用。使用ig而不是g

  • 您可以一次性完成所有更换。只需将它们连接起来,例如。's/\\x00/NUL/ig;s/\\x01/SOH/ig;s/\\x02/STX/ig;...'
    或者
    's/\\x01/SOH/ig; 
      s/\\x02/STX/ig; 
      ... 
      s/\\xFE/þ/ig; 
      s/\\xFF/ÿ/ig;'

  • 您需要更改一些替换表达式:
    /'/should be/\x27/     它与''s/a/b/ig' 中的引用发生冲突
    /\/should be/\\/        否则它会转义/
    /&/should be/\&/        因为它本身是一个反向引用

  • /当替换表达式中出现时,您需要切换分隔符/。仅对于这个表达式,将其更改为|(或您喜欢的任何内容),例如。s|\\x2F|/|g; 某些 sed 情况要求在模式开头对其进行转义,例如。范围表达式。'\|^abc|q'

  • 我注意到您的列表与我提出的列表相比有一些差异(基于 Windows-1252 的编码)。您可能想检查这些:( 7F'DEL')    A0(' ')    AD('SHY')

  • sed -i我遇到了关于处理所谓的原位更新方式的不同报告。在任何情况下它都使用临时文件,所以我倾向于使用sponge(package moreutils) 来重写文本文件。

就是这样。这是生成的 sed 命令的示例......

 sed -e '
 s/\\x01/SOH/ig;
 s/\\x02/STX/ig;
 ...
 s/\\xFE/þ/ig;
 s/\\xFF/ÿ/ig;
 ' "$1" | sponge "$1"

完整的命令可以在以下位置找到粘贴.ubuntu

答案4

更新如果您想将十六进制值解释为Windows-1252并以当前区域设置的编码(通常为 *nix 的 UTF-8)表示它们,您可以使用以下命令。笔记。除了每个输入行的换行符 (\n) 之外,此代码片段还作为输入仅有的表单中的数据\x33\x66\x99\xBB\xFF...任何其他内容都会导致错误。

<file sed -re 's|(.)\\x|\1,0x|g; s|^\\x|0x|; $!{s|$|,0x0a|}' |
 tr '\n' ',' | recode Windows-1252/x1..UTF-8 

从这里开始,是我原来的答案(不考虑不同的编码)

您可以xxd在恢复 (-r) 后记 (-p) 模式下使用。xxd是套餐的一部分vi
笔记。测试数据包含十六进制 \n (\x0a) 字符。
xxd忽略任何真正的 \n 字符,因此您可以将十六进制数据拆分为任意多行(如测试文件中所示)。

xxd对于转换直接十六进制转储也很有用,例如。68656c6c6f20776f726c64(你好世界)...sed在这个例子中纯粹是为了删除‘\x’。

第一个片段忽略不是 \xXX 格式的字符...

<file sed -e 's|\\x||g' | xxd -p -r

如果您想保留源文件中的换行符(\n 与 \x0a),请使用此选项(其他文本将被忽略)

<file sed -e 's|\\x||g; s|$|0a|' | xxd -p -r

创建一个测试文件

echo -n "
\x63\x61\x74\x0a\x64\x6f\x67\x0a\x62\x69\x72\x64\x0a\x6d\x6f\x6f
\x73\x65\x0a\x61\x6c\x62\x61\x74\x72\x6f\x73\x73" >file

输出(来自第一个片段,仅作用于 \xXX 数据)

cat
dog
bird
moose
albatross

相关内容