Как восьмеричные 2 байта производятся вычисленные от передозировки

Объединяющаяся голова и хвост, как Вы сделали, будут работать, но для этого я использовал бы sed

sed -n '1,4000p' input_file # print lines 1-4000 of input_file

Это позволяет Вам решить свою проблему с быстрой функцией оболочки

chunk_it(){
    step=4
    start=1
    end=$step
    for n in {1..4} ; do
        sed -n "${start},${end}p" "$1" > "$1".$start-$end
        let start+=$step
        let end+=$step
    done
}

chunk_it your_file

Теперь у Вас есть your_file.1-4000 и yuor_file.4001-8000 и так далее.

Примечание: требует удара

4
17.02.2014, 22:52
2 ответа

По истеричным историческим причинам, od слова двух байтов печати ¹ по умолчанию.

(Восьмеричный) номер 020061 соответствует двухбайтовой последовательности 1␣ ( пробел). Почему? Более ясно, используете ли Вы шестнадцатеричный: 0o20061 = 0x2031, и 0x20 (32) в ASCII и 1 0x31 (49). Заметьте, что биты более низкоуровневые (0x31) соответствуют первому символу, и биты высшего порядка соответствуют второму символу: передозировка собирает слова в порядке с прямым порядком байтов, потому что это, оказывается, порядок байтов Вашей системы. ²

Порядок с прямым порядком байтов не является очень естественным здесь потому что один из выходных форматов (-c) символы печати, другой один (-o) слова печати. Каждое слово печатается как число в обычной нотации с обратным порядком байтов (старшая значащая цифра на первом месте в нашем слева направо порядке чтения). Это еще более очевидно в шестнадцатеричном, где границы байта явно очевидны в числовом выводе:

echo '1 text' | od -xc   
0000000 2031 6574 7478 000a
         1    t e  x t \n\0

Если Вы предпочитаете просматривать файл как последовательность байтов, использовать od -t x1 (или hd если у Вас есть он).

¹ Когда-то давно, мужчины были настоящими мужчинами, компьютеры были реальными компьютерами, числа часто писались в восьмеричном, и слова были два байта длиной.

² Все ПК (x86, x86-64) прямой порядок байтов, как был PDP-11 где запущенный Unix. Центральные процессоры ARM могут справиться с любым порядком байтов, но Linux и iOS используют его в режиме с прямым порядком байтов. Таким образом, большинство платформ, с которыми Вы, вероятно, встретитесь в наше время, является прямым порядком байтов.

9
27.01.2020, 20:47
  • 1
    Спасибо за подробный ответ. Это был порядок байтов, который сбивал меня с толку, когда я пытался сделать ASCII - восьмеричное преобразование сам. –  theconnorpower 03.03.2011, 02:47
  • 2
    я собирался упомянуть endieness, но я рад, что не сделал, Gilles, объяснил это хорошо. –  Mr. Shickadance 03.03.2011, 06:39

Интересный вопрос. После просмотра страницы справочника я нашел, что-o печатает восьмеричный вывод (передозировка == восьмеричный дамп), c, который Вы добавили только, печатает связанные символы также. Вы получаете те же числа с одним только-o.

Рассмотрение вывода, кажется, что передозировка считывает данные два байта за один раз. Возьмите первые два символа, например:

CHAR - OCTAL - BINARY
1      061     0011 0001
SPACE  040     0010 0000

Ответ появляется, когда мы связываем двоичные значения (с '1' справа, ПРОСТРАНСТВО слева):

0010 0000 0011 0001

Преобразование этого двоичного значения к восьмеричному дает нам 020061, который является тем, что распечатала передозировка.

Теперь, почему? Я думаю дело в том, что передозировка читает два байта за один раз, и она не затронута или не знает, что те два байта являются на самом деле двумя отдельными символами.

3
27.01.2020, 20:47

Теги

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