Преобразование шестнадцатеричной строки в двоичный файл с простым awk под cygwin

Попытка преобразовать шестнадцатеричную строку, заданную в виде строки в форме 31ff097112 с обычным awk в двоичный файл с использованием cygwin (работает при запуске в 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 (нет, не perl, не python, не C) только с использованием функций awk.

NB: Мои простые awk-решения прекрасно работают с linux awk, так что, может быть, в cygwin должны быть установлены другие варианты, чтобы это работало?

1 ответ

Решение

Извините, что отвечаю на мой вопрос, только что нашел решение: вызвать awk с -b или же --characters-as-bytes, то это также работает изнутри Cygwin...

Другие вопросы по тегам