Oracle11g大整数到php中的十六进制字符串转换

发布于 2024-10-16 22:29:44 字数 219 浏览 5 评论 0原文

我在表中有一列声明为 macaddr NUMBER(15) (macaddress 整数表示范围 - 最多 15 位数字)

PHP 将此值作为字符串获取,显然在 32 位系统上 dechex< /code> 不会处理那么大的整数。

我如何轻松地将字符串转换为十六进制 macaddr 表示形式(人类可编辑)?反方向同样的问题?

I have a column in table declared as macaddr NUMBER(15) (macaddress integer representation range - up to 15 digits)

The PHP fetch this values as a strings, obviously on 32bit system the dechex will not handle that big ints.

How I can easily convert that strings into hex macaddr representation (human redable)? And same question in opposite direction?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

じее 2024-10-23 22:29:44

您真的需要以数字形式存储这些信息吗?现代计算机有足够的可用空间。

无论如何,您可以使用 PHP 转换大于该值的数字。
我的简单解决方案是避免依赖 PHP 提供的类型并使用 BCMath 任意精度数学
根据手册,该库从 4.0.4 版本开始就与 PHP 捆绑在一起。如果您在 Windows 中运行 PHP,它可以直接运行。否则,您必须使用 --enable-bcmath 进行配置。
感谢 PHP.net 网站上的用户贡献的注释,我发现了这两个方便的函数:

<?php

        /* hexadecimal to/from decimal functions from user contributed notes at http://it.php.net/manual/en/ref.bc.php */

        function bchexdec($hex) {
            if(strlen($hex) == 1) {
                return hexdec($hex);
            } else {
                $remain = substr($hex, 0, -1);
                $last = substr($hex, -1);
                return bcadd(bcmul(16, bchexdec($remain)), hexdec($last));
            }
        }

        function bcdechex($dec) {
            $last = bcmod($dec, 16);
            $remain = bcdiv(bcsub($dec, $last), 16);

            if($remain == 0) {
                return dechex($last);
            } else {
                return bcdechex($remain).dechex($last);
            }
        }

    echo bcdechex (130646634308);

    echo '<br />';

    echo bchexdec ('001e6b256f44');


    ?>

Do you really need to store these informations in a numeric form? Modern computers have plenty of space available.

Anyway you can use PHP to convert numbers larger than that.
My humble solution is to avoid relying on types provided by PHP and use the BCMath Arbitrary Precision Mathematics.
According to the manual the library comes bundled with PHP since release 4.0.4. If you run PHP in Windows it works straight. Otherwise you have to configure with --enable-bcmath .
Thanks to user contributed notes on the PHP.net website I found these two handy functions:

<?php

        /* hexadecimal to/from decimal functions from user contributed notes at http://it.php.net/manual/en/ref.bc.php */

        function bchexdec($hex) {
            if(strlen($hex) == 1) {
                return hexdec($hex);
            } else {
                $remain = substr($hex, 0, -1);
                $last = substr($hex, -1);
                return bcadd(bcmul(16, bchexdec($remain)), hexdec($last));
            }
        }

        function bcdechex($dec) {
            $last = bcmod($dec, 16);
            $remain = bcdiv(bcsub($dec, $last), 16);

            if($remain == 0) {
                return dechex($last);
            } else {
                return bcdechex($remain).dechex($last);
            }
        }

    echo bcdechex (130646634308);

    echo '<br />';

    echo bchexdec ('001e6b256f44');


    ?>
残月升风 2024-10-23 22:29:44

您可能会发现 PHP 提供的 float 类型很有用,它足够大,可以容纳您的值。首先转换为浮点数,然后插入或更新到数据库字段中。这里的主要问题是将浮点数与十六进制相互转换。

经过我自己尝试编写 hex2dec 函数的一些工作后,我想出了资源:PHP 手册。

看一下 Nstiac 的第一条评论。他编写了几个函数将十六进制字符串转换为浮点数

编辑:所提供的函数显示以某种方式被破坏(请参阅下面的评论)!使用风险自负!

http://www.php。 net/manual/en/language.types.float.php

You could find useful the float type, provided by PHP, which is large enough to hold your values. First convert into a float and then insert or update into your database field. The main problem here is to convert floats to/from hexadecimals.

After some work on my own trying to write a hex2dec function I came up with the resource: the PHP manual.

Take a look at the first comment, by Nstiac. He writes a couple of functions to convert Hex strings to Floating point numbers

EDIT: The functions provided revealed to be broken somehow (see comments below)! Use at your risk!

http://www.php.net/manual/en/language.types.float.php

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文