在PHP中创建signed int的十六进制表示

时间:2017-05-23 12:58:27

标签: php hex

我正在解析一个二进制文件并偶然发现了一些我需要从十六进制转换为十六进制的16位(2字节)值,反之亦然。 正值看起来像“0075”(117),而负值看起来像“FE75”( - 395)。

我正在使用此函数从十六进制转换为有符号的int,这有效,但我似乎无法找到一个解压缩符号到十六进制表示。

java_test

3 个答案:

答案 0 :(得分:0)

感谢您的所有评论, 我最终得到了这个,这正是我想要的。

你太棒了!

/**
 * Converts signed decimal to hex (Two's complement)
 *
 * @param $value int, signed
 *
 * @param $reverseEndianness bool, if true reverses the byte order (see machine dependency)
 *
 * @return string, upper case hex value, both bytes padded left with zeros
 */
function signed2hex($value, $reverseEndianness = true)
{
    $packed = pack('s', $value);
    $hex='';
    for ($i=0; $i < 2; $i++){
        $hex .= strtoupper( str_pad( dechex(ord($packed[$i])) , 2, '0', STR_PAD_LEFT) );
    }
    $tmp = str_split($hex, 2);
    $out = implode('', ($reverseEndianness ? array_reverse($tmp) : $tmp));
    return $out;
}

答案 1 :(得分:0)

对于有符号整数,请使用i$i < 4;而不是s$i < 2;

/**
 * Converts signed decimal to hex (Two's complement)
 *
 * @param $value int, signed
 *
 * @param $reverseEndianness bool, if true reverses the byte order (see machine dependency)
 *
 * @return string, upper case hex value, both bytes padded left with zeros
 */
function signed2hex($value, $reverseEndianness = true)
{
    $packed = pack('i', $value);
    $hex='';
    for ($i=0; $i < 4; $i++){
        $hex .= strtoupper( str_pad( dechex(ord($packed[$i])) , 2, '0', STR_PAD_LEFT) );
    }
    $tmp = str_split($hex, 2);
    $out = implode('', ($reverseEndianness ? array_reverse($tmp) : $tmp));
    return $out;
}

echo signed2hex(-1561800392, false); // 38d1e8a2, not 38d1 with `s`

答案 2 :(得分:0)

function DtH ($number, $bytes){
    $string = strtoupper(str_pad(dechex($number), $bytes, "0", STR_PAD_LEFT));
    $string = substr($string, -$bytes), 32);
    return $string;
}

echo DtH(-23715647, 8); //‭ FE9620C1‬

echo DtH(23715647, 8); //‭ ‭169DF3F‬

echo DtH(-23715647, 16); //‭‭ FFFFFFFFFE9620C1‬