views:

48

answers:

2

For example I would like to convert 2001 into: "0x07", "0xD1"

Thanks

+1  A: 

I'm not sure what exact format you want it in, but one way to convert to hex is:

sprintf("%x", 2001)
Marcelo Cantos
This not quite good for me. I need to convert each byte to hex string.
embedded
What you are trying to do is somewhat awkward. If you describe what you are trying to achieve at a higher level, an alternative strategy might occur to someone.
Marcelo Cantos
I need to fill in a struct in C.therefore I need to be able to write a script that breaks each byte ofan int to hex string byte.
embedded
Are you trying to generate C code, or simply construct the bytes of a C struct? If it's the latter, then use `pack("S", 2001)`.
Marcelo Cantos
+1  A: 

This works for that case:

($x,$y) = map { "0x$_" } 
          sprintf("%04X\n", 2001) =~ /(..)(..)/; 

But I wonder what you're really trying to do. If you're trying to get UTF-16, this isn't the way you want to do that.

If you're trying to figure out the layout of packed binary data, then you should be using unpack. The "C4" format would work for a 4-byte integer.

$int = 2001;
$bint = pack("N", $int);
@octets = unpack("C4", $bint);
printf "%02X " x 4 . "\n", @octets;
# prints: 00 00 07 D1

For some purposes, you can use printf's vector print feature:

printf "%v02X\n", pack("N", 2001);
# prints: 00.00.07.D1

printf "%v02X\n", 255.255.255.240;
# prints: FF.FF.FF.F0
tchrist
This is quite good, could you please generalize it a bitand not only for 2 bytes numbers.I've changed ($x,$y) to @arr, what about the =~ /(..)(..)/?
embedded