1

プレーンな awk を使用して文字列として指定された 16 進文字列を、cygwin を使用してバイナリ ファイルに変換しようとしてい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 ソリューションの問題は、すべての値 >= 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 (そこにヒントが見つかりました) はそれを正しく行います (予想どおり:-):

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

したがって、awkの機能のみを使用してawk(いいえ、perlではなく、pythonではなく、Cではありません)で動作するソリューションがあるかどうかを知りたいです。

NB: 私の単純な awk ソリューションは Linux awk で完璧に動作するので、それを機能させるために cygwin 内で設定するオプションがいくつかあるのではないでしょうか?

4

1 に答える 1

2

私自身の質問に答えて申し訳ありませんが、解決策を見つけました: -bor --characters-as-bytesで awk を呼び出すと、cygwin 内からも機能します...

于 2013-05-31T18:58:35.420 に答える