当前位置: 首页 > 知识库问答 >
问题:

如何删除十六进制数右边的X位?

金亦
2023-03-14

我正在处理缓存问题,需要将地址拆分为标记/设置/偏移。例如,我有地址0xFFFFFE7D6C5B4333,例如,偏移量包含5位(偏移量是地址右侧的第一个块)。然后我必须将十六进制地址转换成二进制,去掉前5位,然后将其转换回十六进制。这个过程可能需要一些时间,而且可能会导致一些错误。如果偏移位数的格式是4*c,那么就很容易了,因为我只需要从十六进制代码中删除右前c位数。

当偏移位数不是格式4*c(例如5)时,有没有更好的方法?

例如对于0xFFFFFE7D6C5B4333我们得到:

1111 1111 1111 1111 1111 1110 0111 1101 0110 1100 0101 1011 0100 0011 0011 0011

我们去掉前五位,得到:

1111 1111 1111 1111 1111 1110 0111 1101 0110 1100 0101 1011 0100 0011 001

返回十六进制:0x7FFFFF3EB62DA19

共有1个答案

鄢开诚
2023-03-14

我建议转换为十进制(或二进制)数,移位,再转换回来。问题是你使用的是大整数。大多数编程语言都支持仲裁大整数。例如,PHP有一个BC库。使用它,我可以快速编写函数在BC中十六进制和dec之间转换。我可以通过多次除以2来编写移位。然后,我可以执行你的示例。它本质上是三个函数调用:bchexdec、bcft和bcdechex。

<?php
$hex = "FFFFFE7D6C5B4333";
print "HEX = $hex\n";
$dec = bchexdec($hex);
print "DEC = $dec\n";
$dec = bcshift($dec,5);
print "DEC = $dec\n";
$hex = bcdechex($dec);
print "HEX = $hex\n";

function bcshift($dec,$n) {
    for($i=0; $i<$n; $i++) {
        $dec = bcdiv($dec,"2");
    }
    return $dec;
}
function bchexdec($hex)
{
    $dec = 0;
    $len = strlen($hex);
    for ($i = 1; $i <= $len; $i++) {
        $dec = bcadd($dec, bcmul(strval(hexdec($hex[$i - 1])), bcpow('16', strval($len - $i))));
    }
    return $dec;
}
function bcdechex($dec) {
    $hex = '';
    do {
        $last = bcmod($dec, 16);
        $hex = dechex($last).$hex;
        $dec = bcdiv(bcsub($dec, $last), 16);
    } while($dec>0);
    return $hex;
}
?>

所以,你的问题实际上是在你想要使用的任何编程语言中编写这三个函数。然后,如果你经常这样做,写一个函数来包装这三个函数调用

 类似资料:
  • 问题内容: 我在ex中有整数。16,我正在尝试将此数字转换为十六进制数字。我试图通过使用十六进制函数来实现此目的,但是每当您向十六进制函数提供整数时,它都会返回十六进制数字的字符串表示形式, 有人可以告诉我如何将字符串格式的十六进制数字转换为简单的十六进制数字。 谢谢!! 问题答案:

  • 问题内容: 我想从my_table中选择类似LIKE’%HEX(9D)’的家庭十六进制格式以9D十六进制结尾的家庭,我将excel文件转换为sqlite数据库,但是我的某些数据以9D结尾结束,我无法正确搜索,请指导我如何删除“家庭”列中的9D十六进制字符? 问题答案: 要在SQLLite中获取HEX(9D),请使用。所以要更新使用类似: ; 要不就

  • 本文向大家介绍如何将十六进制转换为十进制?,包括了如何将十六进制转换为十进制?的使用技巧和注意事项,需要的朋友参考一下 而十六进制数是具有值是16的数字系统中的一个并且它具有唯一的16个码元:0,1,2,3,4,5,6,7,8,9和A,B,C,d,E ,其中A,B,C,D,E和F分别是十进制值10、11、12、13、14和15的单位表示。而十进制系统是最熟悉的号码系统向公众开放。它是10的基数,只

  • 本文向大家介绍如何将十进制转换为十六进制?,包括了如何将十进制转换为十六进制?的使用技巧和注意事项,需要的朋友参考一下 十进制是公众最熟悉的数字系统。它是基数10,只有10个符号-0、1、2、3、4、5、6、7、8和9。而十六进制是计算机或数字系统中最常见的数字系统颜色表示。它是基数16,只有16个符号:0、1、2、3、4、5、6、7、8、9和A,B,C,D,E,F。这些A,B,C,D ,E,F分

  • 我从下面的另一个问题中看到了一个代码,但我不知道如何利用它。

  • 我必须生成一个从\x00到\xff的所有十六进制列表,但用户提供的十六进制除外。 示例: GenerateHex.py 00,03 \X01\X02\X04\X05\X06\X07\X08\X09\X0A\X0B\X0C\X0D\X0E\X0F\X10\X11\X12\X14\X15\X17\X18\X19\X1A\X1B\X1B\X1F\X20\X21\X22\X25\X26\X28\X29\X