【问题标题】:Printf tab character as hexPrintf 制表符为十六进制
【发布时间】:2017-10-26 13:27:38
【问题描述】:

在受限 shell 中,我只能执行 printf(没有 awk、hexdump、xxd、...),所以我使用此脚本将文件打印为 hex:

a=$(<file.txt)
for ((i=0;i<${#a};i++));
do c=${a:$i:1}; 
    if [[ $c == ' ' ]]; then printf "%X" \'\ \'; 
    elif [[ $c == $'\r' ]]; then printf "%X" \'\r\'; 
    elif [[ $c == $'\t' ]]; then printf "%X" \'\t\'; 
    elif [[ $c == $'\n' ]]; then printf "%X" \'\n\'; 
    else printf %02x \'${a:$i:1};
    fi; 
done

问题: 最后一行 (printf %02x \'${a:$i:1}) 不适用于某些字符,如 \s,\r,\n,\t,... 我用 (printf "%X" \'\ \') 处理空格字符,但不适用于 \r、\t 和 \n

printf "%X" \'\t\' ---> 74
printf "%X" "'\t"  ---> 5C
printf "%X" \'$"\t"---> 5C

但它应该返回 09!

【问题讨论】:

  • 请检查我的回复的更新。

标签: linux bash printf


【解决方案1】:

我得到了 9 个

printf "%X" \'$'\t'

引用表达式应该简化代码,不需要ifs:

a=$(<file.txt)
for (( i=0 ; i < ${#a} ; i++ )) ; do
    c=${a:$i:1}
    printf %02x \'"$c"
done

【讨论】:

  • 对提高速度有什么建议吗?对于几 MB 大小的文件,它将每秒打印少于 10 个字节!
  • @Giac:用真正的编程语言重写。
  • 我别无选择,我的帐户访问权限有限(只有一些本机命令)。我想生成一些二进制文件的 hexdump 来复制这些字符串并将其转换为本地机器上的真实文件。这是我的场景
  • @Giac bash 似乎不能有效地处理大字符串,因此如果文件很大,将整个内容放在变量中会显着减慢处理速度。尝试通过添加外部循环一次读取和处理小块:while IFS= read -r -d '' -n 512 a; do ...chorba 的 for 循环在这里...done &lt;file.txt。另外,警告:对于二进制数据,这些都不安全,因为 shell 不允许在变量(或参数,或其他任何地方)中使用空字节。
  • 实际上,经过一番测试,看起来一次读取的最佳字符数不是 512(我在上面的猜测),而是 1(并跳过内部循环)。所以只需使用while IFS= read -r -d '' -n 1 c; do printf "%02x " \'"$c"; done &lt;file.txt。在我的笔记本电脑上,一个大约 3MB 的文件大约需要 2 分钟。
猜你喜欢
  • 2013-01-21
  • 1970-01-01
  • 2015-12-09
  • 1970-01-01
  • 2021-04-10
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
相关资源
最近更新 更多