WSBT
WSBT

Reputation: 36323

How to output binary files in Perl?

I want to be able to output 0x41, and have it show up as A.

This is what I have tried so far:

my $out;
open $out, ">file.txt" or die $!;
binmode $out;
print $out 0x41;
close $out;

It outputs 65 instead of A in the resulting file. This is not what I want.

I also have read this similar question, but I wouldn't transfer the answer over. pack a short results to 2 bytes instead of 1 byte.

Upvotes: 4

Views: 1922

Answers (3)

F. Hauri  - Give Up GitHub
F. Hauri - Give Up GitHub

Reputation: 70762

pack need two argument: The first argument explain how and how many data have to be packed:

perl -e 'printf "|%s|\n",pack("c",0x41,0x42,0x44);'
|A|

perl -e 'printf "|%s|\n",pack("c3",0x41,0x42,0x44);'
|ABD|

perl -e 'my @bytes=(0x41,0x42,0x43,0x48..0x54);
         printf "|%s|\n",pack("c".(1+$#bytes),@bytes);'
|ABCHIJKLMNOPQRST|

you could even mix format in the 1st part:

perl -e 'printf "|%s|\n",pack("c3B8",0x41,0x42,0x44,"01000001");'
|ABDA|

Upvotes: 1

Amadan
Amadan

Reputation: 198324

You can use chr(0x41).

For larger structures, you can use pack:

pack('c3', 0x41, 0x42, 0x43) # gives "ABC"

Regarding your suspicion of pack, do go read its page - it is extremely versatile. 'c' packs a single byte, 's' (as seen in that question) will pack a two-byte word.

Upvotes: 3

Guru
Guru

Reputation: 16974

Use the chr function:

print $out chr 0x41

Upvotes: 1

Related Questions