оболочка: преобразование десятичной дроби в собственное шестнадцатеричное число

#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