存档

2017年3月 的存档

php将两个单字节组成一个双字节

2017年3月16日 评论已被关闭

比如0x12和0x34这两个字节如果要组成一个双字节,则可以使用unpack的S格式化字符来实现,代码如下:

<?php
$data = unpack("S", pack("H*", "3412"));
print_r($data);
echo '0x' . dechex($data[1]) . "\n";

/*
Array
(
    [1] => 4660
)
0x1234
*/

因为是小端序,所以要写成"3421"。其实还可以用位运算的方式来实现。这个时候就不需要考虑字节序了,因为字节序只是存储时才需要考虑的问题,对于输出来说,是按照我们自然的方式:

<?php
print "0x" . dechex((0x12 << 8 ) | 0x34) . "\n";

/*
0x1234
*/


参考资料
PHP: chr和pack、unpack那些事
https://my.oschina.net/goal/blog/202378

分类: php 标签:

php判断大端序和小端序的方法

2017年3月16日 评论已被关闭

L表示无符号长整型,按主机字节序。N表示无符号长整型,大端序。它们都是32位的,所以如果用L和N对同一个整数进行打包,如果结果相等,则本机字节序就是大端序,否则就是小端序。代码如下:
<?php
define('BIG_ENDIAN', pack('L', 1) === pack('N', 1));

if (BIG_ENDIAN)
{
    echo "大端序";
}
else
{
    echo "小端序";
}

echo "\n";

参考资料
PHP: pack/unpack补遗
https://my.oschina.net/goal/blog/202381

PHP pack() format for signed 32 int – big endian
http://stackoverflow.com/questions/16039751/php-pack-format-for-signed-32-int-big-endian

分类: php 标签:

php字符串长度计算

2017年3月16日 评论已被关闭

当在处理字符时,如果字节小于0x80,则把它当作单字节来处理,否则会继续读取下一个字节,这通常跟编码有关,GBK会将2个字节当成一个字符来处理,UTF8则需要3个字节。有时候在PHP中需要做类似的处理,比如计算字符串中字符的个数(字符串可能包含单字节和多字节),strlen方法只能计算字节数,而mb_strlen需要开启扩展。类似这样的需求,其实很容易处理:

<?php
function mbstrlen($str)
{
    $len = strlen($str);
    
    if ($len <= 0)
    {
        return 0;
    }
    
    $count  = 0;
    
    for ($i = 0; $i < $len; $i++)
    {
        $count++;
        if (ord($str{$i}) >= 0x80)
        {
            $i += 2;
        }
    }
    
    return $count;
}

echo "output: " . mbstrlen("中国so强大!") . "\n";

?>

以上代码的实现就是利用单字节字符的ASCII码小于0x80。至于要跳过几个字节,这要看具体是什么编码.

参考资料:

PHP: 深入pack/unpack
https://my.oschina.net/goal/blog/195749

分类: php 标签:


标签

ajax apache array array_slice CentOS checkbox composer cookie csv curl date DATE_FORMAT excel FCKEditor file_get_contents laravel Magento Certified Developer mb_substr memcache Memcached MySQL String Functions Netbeans openssl php面试题 preg_match_all preg_replace QQ登录 rewrite SaeStorage serialize session setTimeout Sphinx spl Storage strtotime ueditor vsftp vsftpd Zend zip 分割字符串 图片处理 新浪云 正则表达式

存档