0x7FFFFFFF 介绍

2017年4月7日 评论已被关闭

0x7FFFFFFF 是long int的最大值

可以算一下 0x7FFFFFFF 是多少
每个十六进制数4bit,因此8位16进制是4个字节,刚好是一个int整型

F的二进制码为 1111
7的二进制码为 0111

这样一来,整个整数 0x7FFFFFFF 的二进制表示就是除了首位是 0,其余都是1
就是说,这是最大的整型数 int(因为第一位是符号位,0 表示他是正数)

0x7FFFFFFF 的二进制表示是 0b1111111111111111111111111111111;

php 中用 PHP_INT_MAX 常量可以替代这个值。

<?php
echo 0x7FFFFFFF;//2147483647
echo '<br />';
echo 0b1111111111111111111111111111111;//2147483647
echo '<br />';
echo PHP_INT_MAX;//2147483647
?>

其他:

~0取反:表示最小值。

~0u表示无符号整形0

~0 >> 1 :表示最大值

分类: php 标签:

PHP is_writeable函数bug问题

2017年4月7日 评论已被关闭

 1、在windowns中,当文件只有只读属性时,is_writeable()函数才返回false,当返回true时,该文件不一定是可写的。
如果是目录,在目录中新建文件并通过打开文件来判断;
如果是文件,可以通过打开文件(fopen),来测试文件是否可写。

2、在Unix中,当php配置文件中开启safe_mode时(safe_mode=on),is_writeable()同样不可用。
读取配置文件是否safe_mode是否开启。

   

/**
     * Tests for file writability
     *
     * is_writable() returns TRUE on Windows servers when you really can't write to
     * the file, based on the read-only attribute.  is_writable() is also unreliable
     * on Unix servers if safe_mode is on.
     *
     * @access    private
     * @return    void
     */
    if ( ! function_exists('is_really_writable'))
    {
        function is_really_writable($file)
        {
            // If we're on a Unix server with safe_mode off we call is_writable
            if (DIRECTORY_SEPARATOR == '/' AND @ini_get("safe_mode") == FALSE)
            {
                return is_writable($file);
            }

            // For windows servers and safe_mode "on" installations we'll actually
            // write a file then read it.  Bah...
            if (is_dir($file))
            {
                $file = rtrim($file, '/').'/'.md5(mt_rand(1,100).mt_rand(1,100));

                if (($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
                {
                    return FALSE;
                }

                fclose($fp);
                @chmod($file, DIR_WRITE_MODE);
                @unlink($file);
                return TRUE;
            }
            elseif ( ! is_file($file) OR ($fp = @fopen($file, FOPEN_WRITE_CREATE)) === FALSE)
            {
                return FALSE;
            }

            fclose($fp);
            return TRUE;
        }
    }
分类: php 标签:

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

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

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

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

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

因为是小端序,所以要写成"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日 评论已被关闭

当在处理字符时,如果字节小于0×80,则把它当作单字节来处理,否则会继续读取下一个字节,这通常跟编码有关,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}) >= 0×80)
        {
            $i += 2;
        }
    }
    
    return $count;
}

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

?>

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

参考资料:

PHP: 深入pack/unpack

https://my.oschina.net/goal/blog/195749

分类: php 标签:


标签

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

存档