Ωmega
Ωmega

Reputation: 43703

Convert number to hex

I use sprintf for conversion to hex - example >>

$hex = sprintf("0x%x",$d)

But I was wondering, if there is some alternative way how to do it without sprintf.

My goal is convert a number to 4-byte hex code (e.g. 013f571f)

Additionally (and optionally), how can I do such conversion, if number is in 4 * %0xxxxxxx format, using just 7 bits per byte?

Upvotes: 1

Views: 672

Answers (4)

ikegami
ikegami

Reputation: 386676

My goal is convert a number to 4-byte hex code (e.g. 013f571f)

Hex is a textual representation of a number. sprintf '%X' returns hex (the eight characters 013f571f). sprintf is specifically designed to format numbers into text, so it's a very elegant solution for that.

...But it's not what you want. You're not looking for hex, you're looking for the 4-byte internal storage of an integer. That has nothing to do with hex.

pack 'N', 0x013f571f;  # "\x01\x3f\x57\x1f" Big-endian byte order
pack 'V', 0x013f571f;  # "\x1f\x57\x3f\x01" Little-endian byte order

Upvotes: 2

Ωmega
Ωmega

Reputation: 43703

For 4 * %0xxxxxxx format, my non-sprintf solution is:

print unpack("H8", pack("N1", 
  (((($d>>21)&0x7f)<<24) + ((($d>>14)&0x7f)<<16) + ((($d>>7)&0x7f)<<8) + ($d&0x7f))));

Any comments and improvements are very welcome.

Upvotes: 1

Squeezy
Squeezy

Reputation: 525

sprintf() is my usual way of performing this conversion. You can do it with unpack, but it will probably be more effort on your side.

For only working with 4 byte values, the following will work though (maybe not as elegant as expected!):

print unpack("H8", pack("N1", $d));

Be aware that this will result in 0xFFFFFFFF for numbers bigger than that as well.

For working pack/unpack with arbitrary bit length, check out http://www.perlmonks.org/?node_id=383881

The perlpacktut will be a handy read as well.

Upvotes: 1

Barmar
Barmar

Reputation: 782594

sprintf() is probably the most appropriate way. According to http://perldoc.perl.org/functions/hex.html:

To present something as hex, look into printf, sprintf, and unpack.

I'm not really sure about your second question, it sounds like unpack() would be useful there.

Upvotes: 4

Related Questions