Reputation: 36323
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
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
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