【问题标题】:Changing endianness in PHP在 PHP 中改变字节顺序
【发布时间】:2011-09-25 16:59:39
【问题描述】:

所以我在 PHP 中创建一个类来解析 VPK 文件格式。

但是我遇到了一个问题:

object(VPKHeader)#2 (3) {
    ["Signature"]=>
  string(8) "3412aa55"
    ["Version"]=>
  string(4) "1000"
    ["DirectoryLength"]=>
  int(832512)
}

签名应该是 0x55aa1234,但是我正在读取的签名是 0x3412aa55。

如何在 PHP 中切换字节顺序?

【问题讨论】:

    标签: php file-format endianness


    【解决方案1】:

    如果您的十六进制值始终是字符串,您可以使用以下函数:

    function swapEndianness($hex) {
        return implode('', array_reverse(str_split($hex, 2)));
    }
    

    同意,这不是最有效的,但我认为代码非常优雅。此外,它适用于所有大小的数字。

    【讨论】:

    • 非常感谢!做到了!我在阳光下尝试了所有方法来尝试投射十六进制数字,但无济于事。你的方法非常有效。谢谢!
    【解决方案2】:

    您必须手动转换值。该算法将与 C++ 中的相同,因此只需移植此代码(您只需要适用于 int afaik 的代码):

    inline void endian_swap(unsigned short& x)
    {
        x = (x>>8) | 
            (x<<8);
    }
    
    // this is the one you need
    inline void endian_swap(unsigned int& x)
    {
        x = (x>>24) | 
            ((x<<8) & 0x00FF0000) |
            ((x>>8) & 0x0000FF00) |
            (x<<24);
    }
    
    // __int64 for MSVC, "long long" for gcc
    inline void endian_swap(unsigned __int64& x)
    {
        x = (x>>56) | 
            ((x<<40) & 0x00FF000000000000) |
            ((x<<24) & 0x0000FF0000000000) |
            ((x<<8)  & 0x000000FF00000000) |
            ((x>>8)  & 0x00000000FF000000) |
            ((x>>24) & 0x0000000000FF0000) |
            ((x>>40) & 0x000000000000FF00) |
            (x<<56);
    }
    

    来源:http://www.codeguru.com/forum/showthread.php?t=292902

    【讨论】:

    • 害怕这个:P 我试着把它移植到这里:pastebin.com/q8LtMy29 这是正确的吗?
    • 请注意,PHP 不支持无符号整数——不确定这会如何影响事情。此外,您可以使用 PHP_INT_SIZE 找到 int 的大小,以了解要使用哪个交换(虽然您不需要 ushort)
    • 不完全是,它当前显示签名为 NULL。这是我正在做的一个小例子:pastebin.com/cQnLEp1r
    • @anttir:一切都是通过引用传递的,不需要return语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多