Shell脚本未编码ASCII

Shell脚本未编码ASCII,shell,character-encoding,ascii,Shell,Character Encoding,Ascii,我下载了一个shell脚本,将OpenVPN文件和证书转换为.apc文件,以便与Sophos UTM 9一起使用。该脚本可以找到,并且似乎工作得很好 问题是输出似乎没有被编码(我相信这是正确的术语) 当我将脚本的输出与从Notepad++中的UTM下载的.apc文件进行比较时,脚本输出以 \x04\x06\x04 而正确编码的文件 EOT BEL EOT 当我尝试导入脚本的输出时,它失败了,我相信这是因为ASCII字符没有正确编码 是否还有其他方法可以对所有\x进行编码??为了合适的角色?或

我下载了一个shell脚本,将OpenVPN文件和证书转换为.apc文件,以便与Sophos UTM 9一起使用。该脚本可以找到,并且似乎工作得很好

问题是输出似乎没有被编码(我相信这是正确的术语)

当我将脚本的输出与从Notepad++中的UTM下载的.apc文件进行比较时,脚本输出以

\x04\x06\x04
而正确编码的文件

EOT BEL EOT
当我尝试导入脚本的输出时,它失败了,我相信这是因为ASCII字符没有正确编码

是否还有其他方法可以对所有\x进行编码??为了合适的角色?或者有没有办法让.sh输出已经编码的字符

作为参考,shell脚本具有以下功能

write_header() {
    printf "\x04\x06\x041234\x04\x04\x04\x08\x03\x0c\x00\x00\x00\x0a" > ${ApcFile}
}

您不应该在生成的文件中看到任何像
\x04
这样的字符。 该脚本对控制字符只使用十六进制表示

如果您在shell上执行
printf“\x04\x06test”
,您应该会看到“test”,如果您将它导入一个类似
xxd
的hextdumper,您应该会得到以下结果

# printf "\x04\x06test" | xxd
0000000: 0406 7465 7374                           ..test
标题序列

printf "\x04\x06\x041234\x04\x04\x04\x08\x03\x0c\x00\x00\x00\x0a"
翻译为(控制字符包装在[]括号中,以便于澄清)

有趣的是:您说工作文件以
EOT BEL EOT(\x04\x07\x08)
开头,脚本生成的输出文件以
EOT ACK EOT
开头(这很有意义)

反问题:

  • 在像vi这样的文本编辑器中查看输出文件时,您会看到控制字符的十六进制表示形式吗
  • 您在哪种操作系统上执行此操作
  • 有趣的问题:
    -..-..-..-/-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-..-

您介意发布正确apc文件的apc头部分以供参考吗?从输出中.apc[EOT][BEL][EOT]1234[EOT][EOT][EOT][BS][ETX]谢谢您的详细回答Michel,当我执行时,
printf“\x04\x06test”
我只看到了test,当我将它传输到xxd时,我看到了您所描述的内容。当我在vi中打开工作文件时,我会看到以蓝色突出显示的控制字符,而当我打开非工作文件(由shell脚本生成)时,我会看到文本
\x04\x06\x04
。我不知道为什么shell脚本输出的是十六进制表示,而不是控制字符本身。我在Ubuntu服务器上运行shell脚本,但我在Windows中下载了文件,并将它们复制到服务器上的Samba共享中。
-/--/---/----/------/------/------/-----
[EOT] [ACK] [EOT] 1234 [EOT] [EOT] [EOT] [BS] [ETX] [FF] [NUL] [NUL] [LF]