my $x = pack 'V', 1234567; my $mask0to5 = 2**6 - 1; my $mask6to11 = $mask0to5 << 6; my $mask12to18 = $mask0to5 << 12; my $mask18to24 = $mask0to5 << 18; sub unpack_6bit_bytes { my $byte_str = unpack 'V', $_[0]; my $byte_1 = $byte_str & $mask0to5; my $byte_2 = ( $byte_str & $mask6to11 ) >> 6; my $byte_3 = ( $byte_str & $mask12to18 ) >> 12; my $byte_4 = ( $byte_str & $mask18to24 ) >> 18; return ( $byte_1, $byte_2, $byte_3, $byte_4 ); } print join ' ', unpack_6bit_bytes($x);