You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux下如何对数据流中的不可打印字符进行十六进制转义?

解决方案

1. 改进Python命令(简洁高效)

直接修改Python代码,输出符合要求的格式,无需额外处理前缀后缀:

dd if=/var/log/wtmp bs=1 count=20 status=none | python -c "import sys; print(''.join(c if 32<=ord(c)<=126 else f'\\x{ord(c):02x}' for c in sys.stdin.buffer.read().decode('latin1')))"
  • 原理:用latin1编码确保每个字节都能正确解码为字符;遍历每个字符,可打印ASCII(32-126)直接保留,否则转为\xXX格式的十六进制转义。

2. 使用hexdump+sed(纯coreutils工具链)

利用hexdump的格式化输出,配合sed替换不可打印字符的转义格式:

dd if=/var/log/wtmp bs=1 count=20 status=none | hexdump -v -e '"%_c"' | sed "s/\o000/\\\x00/g; s/\o001/\\\x01/g; s/\o002/\\\x02/g; s/\o003/\\\x03/g; s/\o004/\\\x04/g; s/\o005/\\\x05/g; s/\o006/\\\x06/g; s/\o007/\\\x07/g; s/\o010/\\\x08/g; s/\o011/\\\x09/g; s/\o012/\\\x0a/g; s/\o013/\\\x0b/g; s/\o014/\\\x0c/g; s/\o015/\\\x0d/g; s/\o016/\\\x0e/g; s/\o017/\\\x0f/g; s/\o020/\\\x10/g; s/\o021/\\\x11/g; s/\o022/\\\x12/g; s/\o023/\\\x13/g; s/\o024/\\\x14/g; s/\o025/\\\x15/g; s/\o026/\\\x16/g; s/\o027/\\\x17/g; s/\o030/\\\x18/g; s/\o031/\\\x19/g; s/\o032/\\\x1a/g; s/\o033/\\\x1b/g; s/\o034/\\\x1c/g; s/\o035/\\\x1d/g; s/\o036/\\\x1e/g; s/\o037/\\\x1f/g; s/\o177/\\\x7f/g"
  • 原理:hexdump -v -e '"%_c"'将可打印字符直接输出,不可打印字符转为八进制转义;sed将所有八进制转义替换为\xXX格式的十六进制转义,覆盖所有ASCII不可打印字符(0x00-0x1F、0x7F)。

3. 使用xxd+shell循环(另一种coreutils组合)

通过xxd将二进制转为十六进制,再用shell逻辑判断处理转义:

dd if=/var/log/wtmp bs=1 count=20 status=none | xxd -p | fold -w2 | while read -r byte; do 
  if [[ "$byte" =~ ^(0[0-9a-f]|1[0-9a-f]|7f)$ ]]; then 
    echo -n "\\x$byte" 
  else 
    echo -n "$(printf "\\x$byte")" 
  fi 
done
  • 原理:xxd -p输出连续的十六进制字符串,fold -w2拆分每个字节;循环判断字节是否为不可打印ASCII,是则输出\xXX,否则转为对应字符输出。

内容的提问来源于stack exchange,提问作者KamilCuk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 06:53:21