1

尝试31ff097112使用 cygwin(在 linux 中运行时有效)将使用纯 awk 形式的字符串以字符串形式给出的十六进制字符串转换为二进制文件。尝试了以下方法:

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 解决方案的问题是,所有 >= 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 工具(在此处找到提示)做得对(如预期的那样:-):

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 中设置了一些其他选项来使其工作?

4

1 回答 1

2

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

于 2013-05-31T18:58:35.420 回答