在cygwin下使用plain awk将十六进制字符串转换为二进制文件

时间:2013-05-31 18:47:09

标签: awk cygwin hex hexdump

尝试使用cygwin将带有普通awk的31ff097112形式的字符串转换为二进制文件(在linux中运行时工作)。尝试以下方法:

BEGIN {
  BINMODE=3;
  ORS="";
  s="000102030405060708ff800f0e0d0c0b0a";
  # not working on cygwin for values >=0x80:
  len=length(s);
  print "">"broken.bin"
  for(i=1; i<=len; i+=2) {
    printf("%c", strtonum("0x"substr(s, i, 2)))>>"broken.bin";
  }
  #working, but uses external xxd command:
  print s>"/tmp/xxx";
  system ("cat /tmp/xxx|xxd -r -p>good.bin");
  exit;
}

所以我的普通awk解决方案的问题是,所有值&gt; = 0x80都以某种方式写入utf8编码到结果文件中:

$ hexdump -C broken.bin
00000000  00 01 02 03 04 05 06 07  08 c3 bf c2 80 0f 0e 0d  |................|
00000010  0c 0b 0a                                          |...|
00000013

而xxd-tool(找到一个提示there)做对了(正如预期的那样: - ):

00000000  00 01 02 03 04 05 06 07  08 ff 80 0f 0e 0d 0c 0b  |................|
00000010  0a                                                |.|

所以我想知道有一个解决方案只能使用awk的功能与awk(不,不是perl,不是python,而不是C)一起工作。

注意:我的普通awk解决方案适用于linux awk完美,所以也许在cygwin中设置其他一些选项可以使其工作吗?

1 个答案:

答案 0 :(得分:1)

很抱歉回答我自己的问题,刚刚找到解决方案:使用-b--characters-as-bytes调用awk,然后它也可以在cygwin中运行...