Bash: write integer to binary file [duplicate]

2019-03-11 04:56发布

Possible Duplicate:
using bash: write bit representation of integer to file

I need to write the size of a file into a binary file. For example:

$ stat -c %s in.txt 
68187

$ stat -c %s in.txt >> out.bin

Instead of writing "68187" string to out.bin, i want to write the 4 bytes int representation of 168187 to out.bin.

How can i convert "68187" to 4 bytes int?

标签: linux bash shell
3条回答
Evening l夕情丶
2楼-- · 2019-03-11 05:13

This is what I could come up with:

int=65534
printf "0: %.8x" $int | xxd -r -g0 >>file

Now depending on endianness you might want to swap the byte order:

printf "0: %.8x" $int | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 >>file

Example (decoded, so it's visible):

printf "0: %.8x" 65534 | sed -E 's/0: (..)(..)(..)(..)/0: \4\3\2\1/' | xxd -r -g0 | xxd
0000000: feff 0000                                ....

This is for unsigned int, if the int is signed and the value is negative you have to compute the two's complement. Simple math.

查看更多
该账号已被封号
3楼-- · 2019-03-11 05:21

You can use the following function to convert a numeric VALUE into its corresponding character:

chr() {
  printf \\$(printf '%03o' $1)
}

You have to convert the byte values individually, after each other in the correct order (endianess) for the machine/architecture that you use. So I guess, a little use of another scripting language that supports binary output would do the job best.

查看更多
男人必须洒脱
4楼-- · 2019-03-11 05:39

See if this works for you

perl -e "print pack('L',`stat -c %s in.txt`)">>out.bin 
查看更多
登录 后发表回答