#bash #shell #hex #endianness #hexdump
#bash #оболочка #шестнадцатеричное #порядковый номер #шестнадцатеричный дамп
Вопрос:
У меня есть тривиальная программа на C ниже, которая принимает int в качестве входных данных и выгружает макет памяти в терминал:
# cat foo.c
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
int i, foo = atoi(argv[argc-1]);
unsigned char *c = (void*)amp;foo;
for (i = 0; i < 4; i )
printf("x ", c[i]);
printf("n");
return 0;
}
Например:
# ./foo 1
01 00 00 00
Мне это нужно было бы именно в таком формате, то есть в виде шестнадцатеричного дампа, разделенного пробелами, и как собственный конечный код (другими словами, как десятичное число будет храниться в памяти).
Есть ли способ добиться того же, например, в bash? Самое близкое, что я получил до сих пор, это:
# echo 1 | xargs printf "xn" | sed 's/../amp; /g'
00 00 00 01
Но, как видно, это выводит шестнадцатеричное значение, но не то, как оно будет храниться в памяти в конце строки.
Комментарии:
1. Большинство современных языков либо требуют перекомпиляции в каждой собственной среде (они могут видеть порядковый номер), либо являются кроссплатформенными (они не могут). Если вы переместите свой скомпилированный код C с ПК на Sun SPARCstation, он не будет запускаться без перекомпиляции, но
bash
скрипт должен работать в обоих местах, поэтому я не думаю, что он будет делать то, что вы хотите.2. Я имел в виду, что это не обязательно должен быть чистый bash / shell, но какой-то базовый инструмент, такой как od / xxd / hexdump / bc и т. Д., Который Уже упакован в данную arch и сделает свое дело. Я думал, что такой инструмент уже будет существовать в какой-то форме, просто я об этом не знаю (отсюда и мой вопрос на этом форуме).
3. Это будет сделано:
perl -e 'print join(" ", unpack("(H2)8", pack("L", @ARGV))), "n"' 1
4. Ах, Perl — тебе всегда удается нарушить правила и спасти положение. <3