Выбирающие отдельные байты от двоичного файла в переменную с ударом

Некоторое волшебство El Torito требуется при создании изображения ISO. Посмотрите это.

8
12.09.2014, 17:59
4 ответа

Я не уверен, что понимаю общую картину того, о чем вы просите, но у меня есть несколько подходов, которые вы, возможно, захотите рассмотреть:

Используйте dd , чтобы прочитать ваш ввод file

exec 3 < input_file
while true
do
    dd bs=1 count=1 <&3 > this_byte
    if ! [ -s this_byte ]       # If size is zero, we’re done.
    then
        break
    fi
    code using the this_byte file
          ︙
done

Используйте od , чтобы обработать ваш входной файл

od -bv input_file | while read a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 a10 a11 a12 a13 a14 a15 a16
do                              # Skip $a0; it’s the address.
    for byte_val in "$a1" "$a2" "$a3" "$a4" "$a5" "$a6" "$a7" "$a8" "$a9" "$a10" \
                                "$a11" "$a12" "$a13" "$a14" "$a15" "$a16"
    do
        if [ "$byte_val" = "" ]
        then
            break
        fi
        code using the $byte_val value
        for example: echo -e "\0$byte_val\c"
              ︙
    done
done
2
27.01.2020, 20:12

Часто APT-GOW предпочтет удалить десятки пакетов вместо того, чтобы просто обновить пару других пакетов.

Я обычно запускаю способность в интерактивном режиме, выберите пакет, который я хочу установить с помощью +, а затем проверять, какие другие пакеты могут быть нарушены этим действием (перейти к следующему «сломанному» пакету с ключом «B». Часто просто просто Обновление тех (опять же с +) решит проблему с небольшим количеством хлопот. Когда все решено, нажмите «g» для «идти и сделать это». Он покажет сводку того, что произойдет (страница через полный список, это кроме закодирован, чтобы помочь), а затем нажмите «G» снова, когда доволен.

-121--175571-

Вместо этого вы можете использовать Perl вместо этого:

$ printf '%s%s%s' 'ăâé' | LC_ALL=C.UTF-8 perl -Mopen=locale -ne '
    BEGIN { $/ = \1 }
    printf "%s\n", $_;
'
ă
â
é
0
27.01.2020, 20:12

Используйте dd или xxd (часть Vim), например, для чтения одного байта ( -l ) по смещению 100 ( -s ) из двоичного файла попробуйте:

xxd -p -l1 -s 100 file.bin

использовать шестнадцатеричные смещения, в Bash вы можете использовать этот синтаксис $ ((16 # 64)) , например:

echo $((16#$(xxd -p -l1 -s $((16#FC)) file.bin)))

, который считывает байт со смещением FC и печатает его в десятичном формате.

В качестве альтернативы используйте dd , например:

dd if=file.bin seek=$((16#FC)) bs=1 count=5 status=none

, который будет выгружать необработанные данные размером 5 байтов с шестнадцатеричным смещением FC .

Затем вы можете присвоить его переменной, однако он не будет работать, если ваши данные содержат NULL байты , поэтому вы можете либо пропустить их ( xxd -a ), либо как обходной путь вы можете хранить их в простом шестнадцатеричном формате.

Например:

  1. Прочитать 10 байтов со смещением 10 в переменную, содержащую байты в шестнадцатеричном формате:

     hex = $ (xxd -p -l 10 -s 10 file.bin) 
     
  2. Затем запишите их в файл или на устройство:

     xxd -r -p> out.bin <<< $ hex 
     

Вот несколько полезных функций в Bash:

set -e

# Read single decimal value at given offset from the file.
read_value() {
  file="$1"
  offset="$2"
  [ -n "$file" ]
  [ -n "$offset" ]
  echo $((16#$(xxd -p -l1 -s $offset "$file")))
}

# Read bytes in hex format at given offset from the file.
read_data() {
  file="$1"
  offset="$2"
  count="$3:-1"
  xxd -p -l $count -s $offset "$file"
}

Пример использования:

read_value file.bin $((16#FC)) # Read 0xFC offset from file.bin.
6
27.01.2020, 20:12

Это, вероятно, проще сделать с помощью крошечной программы на C или (почти) однострочной программы на языке сценариев, таком как Python или Perl.

Оболочка Unix - это интерпретатор пользовательских команд , который (для удобства написания повторяющихся команд) имеет элементарные средства программирования. Его часто (неправильно) используют, потому что версия оболочки Bourne гарантированно будет доступна в любой системе Unix, а не потому, что это особенно хороший (или даже наполовину достойный) язык программирования.

1
27.01.2020, 20:12

Теги

Похожие вопросы