PHP的进制转换与字符串的编码解码

2023-11-20

目录

一、进制转换函数 dechex, hexdec, decbin, bindec, base_convert

二、编码解码函数 bin2hex, hex2bin, pack, 和 unpack

三、字符串类型详解


PHP字符串,从PHP 5.2.1版本 引入binary即二进制字符串。二进制binary字符串,是一种基于字节的字符串,在显示时可能存在不可见字符。通常情况下,我们使用的是ASCII字符组成的字符串,而以b开头的字符串,通常含有不可见字符。

一、进制转换函数 dechex, hexdec, decbin, bindec, base_convert

1、转换为十进制时结果类型为整数,而转换为二进制和十六进制时结果为字符串

2、进制转换的对象,仅为字符串形式的整数。针对字符串时,可以理解为ASCII编码值。

3、base_convert在二进制,八进制,和十六进制之间转换时,可以同时转换一串数字,但转换后的进制数会省略前导零。

4、字节编码序数和二进制字符的转换函数有,ord() 和 chr()。其中,ASCII码字符也不全是可见字符:

    a、0~31及127(共33个)是控制字符或通信专用字符(其余为可显示字符),如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BS(退格)、BEL(响铃)等;通信专用字符:SOH(文头)、EOT(文尾)、ACK(确认)等;ASCII值为8、9、10 和13 分别转换为退格、制表、换行和回车字符。它们并没有特定的图形显示,但会依不同的应用程序,而对文本显示有不同的影响。

    b、32~126(共95个)是字符(32是空格),其中48~57为0到9十个阿拉伯数字。

    c、65~90为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。

例子:

<?php
/**
 * PHP进制转换函数
 * 十进制 88 = 十六进制 58 = 二进制 1011000
 */
$dec = 88;
$hex = dechex($dec); //'58'
$bin = decbin($dec); //'1011000'

/* notes: 如果将$dec初始化为字符串'88'得到的结果不变 */

$hex = '58';
$dec = hexbin($hex); //88

$bin = '1011000';
$dec = bindec($bin); //88

/* notes: 转换为十进制时,类型为整数,而不是字符串 */

$dec = 8.8;
$hex = dechex($dec); //'8'
$bin = decbin($dec); //'1000'

/* notes: 如果有小数,小数部分会被忽略 */ 

$hex_str = '1F1F';
$bin_str = base_convert($hex_str, 16, 2); //"1111100011111", 省略前"0001111100011111"

$ch = "X";
$ord = ord($ch); //'88'
$chr = chr($ord); //'X'

二、编码解码函数 bin2hex, hex2bin, pack, 和 unpack

 1、bin2hex函数,将字符串在内存中的字节码 =>转换为=> 十六进制字符串,主要用于查看字符串在内存中的字节码,结果为十六进制数的字符串形式。

2、hex2bin函数,将十六进制的内存字节码 =>写入到=> 内存,并返回字节字符串(可能为不可见字符,超出ASCII编码范围)(可能未定义,已定义0-127)。

3、unpack ( string $format , string $data [, int $offset = 0 ] ) : array

$format 为显示结果的类型格式,而$data是内存编码数据,即将内存编码进行解码;

将内存编码值,按照指定类型格式,转换为字符串形式的结果值。

返回内存编码值的指定类型数据,(若为ASCII码字符(c),即返回ASCII值;若为十六进制数(H),则返回内存编码值的十六进制等价值)

unpack('H*', $str) 和 bin2hex($str) 等价都是查看ASCII码字符串内存编码值,结果为指定类型的数据。

4、pack ( string $format [, mixed $args [, mixed $... ]] ) : string

$format为$args的类型格式, 而结果为内存编码数据,即对数据进行编码。

pack('H*', $str) 和 hex2bin($str) 等价都是操纵内存编码,结果为该内存编码值的ASCII码字符串。

5、PHP默认对内存编码数据,以ASCII码字符串的形式进行显示。

注意:unpack解码的结果是数组。

<?php
/*
 * PHP内存编码与解码
 */
$c = 'X';
//查看字符'X'的ASCII码的十进制形式
var_dump(hexdec(bin2hex($c))); //88
var_dump(hexdec(unpack('H*', $c)[1])); //88

$code = 88;
//查看ASCII码对应的字符
var_dump(hex2bin(dechex($code))); //'X'
var_dump(pack('H*', dechex($code))); //'X'


/* 字符'X',ASCII码值88,十六进制58 */

//解码
var_dump(ord('X')); //88, 求字符'X"的ASCII值
var_dump(unpack('C*', 'X')[1]);//88, 类似ord('X')

var_dump(bin2hex('X')); //'58', 求字符'X'的十六进制内存编码
var_dump(unpack('H*', 'X')[1]);//'58', 类似ord('X')

//编码
var_dump(chr(88)); //'X', 求ASCII码值对应的字符
var_dump(pack('C*', '88')); //'X', 类似chr(88)

var_dump(hex2bin('58')); //'X', 求内存编码为0x58的ASCII字符
var_dump(pack('H*', '58'));//'X', 求内存编码为0x58的ASCII字符

6、PHP默认字符串为ASCII编码,常说的ASCII码值默认为十进制。

三、字符串类型详解

PHP 中的 string 的实现方式是一个由字节组成的数组再加上一个整数指明缓冲区长度。并无如何将字节转换成字符的信息,由程序员来决定。字符串由什么值来组成并无限制;特别的,其值为 0("NUL bytes")的字节可以处于字符串任何位置(不过有几个函数,在本手册中被称为非"二进制安全"的,也许会把 NUL 字节之后的数据全都忽略)。

字符串类型的此特性解释了为什么 PHP 中没有单独的"byte"类型 - 已经用字符串来代替了。返回非文本值的函数 - 例如从网络套接字读取的任意数据 - 仍会返回字符串。

由于 PHP 并不特别指明字符串的编码,那字符串到底是怎样编码的呢?例如字符串 "á" 到底是等于 "\xE1"(ISO-8859-1),"\xC3\xA1"(UTF-8,C form),"\x61\xCC\x81"(UTF-8,D form)还是任何其它可能的表达呢?答案是字符串会被按照该脚本文件相同的编码方式来编码。因此如果一个脚本的编码是 ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1,以此类推。不过这并不适用于激活了 Zend Multibyte 时;此时脚本可以是以任何方式编码的(明确指定或被自动检测)然后被转换为某种内部编码,然后字符串将被用此方式编码。注意脚本的编码有一些约束(如果激活了 Zend Multibyte 则是其内部编码)- 这意味着此编码应该是 ASCII 的兼容超集,例如 UTF-8 或 ISO-8859-1。不过要注意,依赖状态的编码其中相同的字节值可以用于首字母和非首字母而转换状态,这可能会造成问题。

当然了,要做到有用,操作文本的函数必须假定字符串是如何编码的。不幸的是,PHP 关于此的函数有很多变种:

  • 某些函数假定字符串是以单字节编码的,但并不需要将字节解释为特定的字符。例如 substr(),strpos(),strlen() 和 strcmp()。理解这些函数的另一种方法是它们作用于内存缓冲区,即按照字节和字节下标操作。
  • 某些函数被传递入了字符串的编码方式,也可能会假定默认无此信息。例如 htmlentities() 和 mbstring 扩展中的大部分函数。
  • 其它函数使用了当前区域(见 setlocale()),但是逐字节操作。例如 strcasecmp(),strtoupper() 和 ucfirst()。这意味着这些函数只能用于单字节编码,而且编码要与区域匹配。例如 strtoupper("á") 在区域设定正确并且 á 是单字节编码时会返回 "á"。如果是用 UTF-8 编码则不会返回正确结果,其结果根据当前区域有可能返回损坏的值。
  • 最后一些函数会假定字符串是使用某特定编码的,通常是 UTF-8。intl 扩展和 PCRE(上例中仅在使用了 u 修饰符时)扩展中的大部分函数都是这样。尽管这是由于其特殊用途,utf8_decode() 会假定 UTF-8 编码而 utf8_encode() 会假定 ISO-8859-1 编码。

最后,要书写能够正确使用 Unicode 的程序依赖于很小心地避免那些可能会损坏数据的函数。要使用来自于 intl 和 mbstring 扩展的函数。不过使用能处理 Unicode 编码的函数只是个开始。不管用何种语言提供的函数,最基本的还是了解 Unicode 规格。例如一个程序如果假定只有大写和小写,那可是大错特错。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PHP的进制转换与字符串的编码解码 的相关文章

  • 严格标准:资源 ID#73 用作偏移量,转换为整数

    我使用这个 PHP 函数获取 MySql 结果 function fetcharray query id if query id query id this gt query res if query id this gt q array
  • PHP 数组键字符串不带引号

    我正在将文件移动到服务器 并使用 GET mode 等变量 而 mode 中不带 单引号 它在本地运行良好 但在服务器上我收到通知 我该如何克服这个问题 这是我的 phpinfo 文件phpinfo http solutiq com php
  • 在 PHP 中验证约 400MB 的大型 XML 文件

    我有一个很大的 XML 文件 大约 400MB 在开始处理之前我需要确保它的格式正确 我尝试的第一件事是类似于下面的内容 这很棒 因为我可以找出 XML 是否格式不正确以及 XML 的哪些部分 不好 doc simplexml load s
  • 上传非常大的文件(>5GB)

    我需要你的帮助 我想用 HTML JQuery 和 PHP 创建一个上传脚本 是否可以编写一个可以上传非常大的文件 gt 5 GB 的脚本 我已经尝试使用 FileReader FormData 和 Blobs 但即使使用这些 我也无法上传
  • Facebook PHP API 登录时抛出异常

    我尝试使用 Facebook Graph API 登录并获取用户信息 我用来获取用户信息的代码以前可以工作 但今天我尝试使用 Facebook 登录 但 Facebook API 抛出此错误 未定义的偏移量 1 home vendor fa
  • 使用 Laravel Fluent 查询生成器从多个表中进行选择

    我正在重写一些 PHP MySQL 来与 Laravel 一起使用 我想做的一件事是使数据库查询更加简洁使用 Fluent 查询生成器 http laravel com docs database fluent但我有点迷失 SELECT p
  • fsockopen() 和 SSL 出错,“无法启用加密”

    我正在尝试连接到 Nominet EPP 测试台 但收到 无法启用加密 的消息 这似乎是一个罕见的错误 没有记录的解决方案或原因 用行 socket fsockopen ssl testbed epp nominet org uk 700
  • 需要一个正则表达式将 css 类添加到第一个和最后一个列表项

    更新 谢谢大家的意见 一些附加信息 它实际上只是我正在使用的一小部分标记 20 行 目的是利用正则表达式来完成工作 我还能够修改脚本 电子商务脚本 以在构建导航时插入类 我想限制我所采用的黑客数量 以便在更新到软件的最新版本时让事情变得更容
  • 从字符串中删除第一个和最后一个字符

    我有这个 dataList one two three list explode dataList echo pre print r list echo pre 其输出 gt Array gt 0 gt gt 1 gt one gt 2 g
  • 在 foreach 循环中使用函数会缓存结果,还是每次都调用该函数?

    在下面的代码中 function a echo a return array 1 2 3 4 foreach a as t echo t 我们可以看到 a 仅被调用一次 并且返回值似乎被缓存了 但后来我看到这场辩论 参见对该问题的评论 ht
  • 重定向到另一个文件夹

    我读了这个 htaccess 重写以将根 URL 重定向到子目录 https stackoverflow com questions 990392 htacces rewrite to redirect root url to subdir
  • 正则表达式:如何表达没有下划线的 \w

    有没有简洁的表达方式 w but without 即 w 中包含的所有字符 除了 我问这个是因为我正在寻找最简洁的方式来表达域名验证 域名可以包含小写和大写字母 数字 句号和破折号 但不能包含下划线 w 包括以上所有内容 加上下划线 那么
  • 为什么 strtotime('a') 返回时间?

    我正在 PHP 5 3 中循环遍历 CSV 文件并检查日期 我一直在使用 strtotime 它运行良好 除了我有一个包含 1 或 2 个字符代码的字段 任何单个字符代码上的 strtotime 似乎都像我要求 now 一样 但如果代码是
  • 在 Woocommerce 的单个产品页面上显示特定的自定义产品属性

    我找到了以下代码 https isabelcastillo com woocommerce product attributes functions在产品详细信息页面上显示所有自定义属性 具有我需要的特定条形设计 代码的工作方式就像一个魅力
  • 根据产品属性在 Magento 中创建购物车规则

    我在一个类别中有产品 针 有些以 100 支为一包出售 有些以 500 支为一包出售 盒子中的针数被设置为产品属性 我想根据购物车中的针总数应用购物车规则 F x 如果您购买 1000 2000 根针头 无论 500 100 包的组合如何
  • 如何在刀片模板中通过引用 @include 来传递变量?

    在 Laravel 4 2 设置中 我在模板中有一个变量 我希望在多个包含之间共享该变量 主刀 This is the variable include header lt in header blade I often use tabin
  • Laravel 更新雄辩事件:获取数据

    我一直在读有关雄辩事件的文章 与模型的每次交互都有一个事件 创建 创建 更新 更新 保存 保存 删除 删除 恢复 恢复 我想知道模型更新后的数据以及之前的数据 是否可以 因为文档没有太多关于如何使用这些事件的信息 您正在寻找getDirty
  • 无法下载 Windows 版 Composer SSL:握手超时

    这是我尝试安装 Windows 版 Composer 时得到的结果 The https getcomposer org versions https getcomposer org versions 无法下载文件 SSL 握手超时 无法启用
  • 未找到教义列:1054“字段列表”中未知列“s.features”

    我在站点表中添加了一个新列 features 并使用 Doctrine 重新生成了模型 此代码导致错误 siteTable Doctrine Core getTable Site site siteTable gt findOneByNam
  • 如何使用 PHP 从 iframe 获取 url

    如何从下面的链接获取 YouTube 网址 您可以使用 regex 和 preg match 函数 preg match src iframe string match url match 1 UPDATE如果您有使用 php 生成的页面或

随机推荐

  • VScode+PHPstudy配置PHP开发环境详解

    这篇文章主要介绍了VScode PHPstudy配置PHP开发环境的步骤 整理了官方以及优秀第三方的内容 对于学习和工作有一定借鉴意义 准备安装的软件 VScode和PHPstudy 链接 https pan baidu com s 1T2
  • HTTP报文结构

    1 URL HTTP使用统一资源定位符 URL 协议 主机 端口 路径 2 HTTP 3 HTTP请求报文 请求行 首部 空行 主体 客户端发送一个HTTP请求到服务器的请求报文如下 1 请求行 方法 URL 空行 协议的版本 中间空格隔开
  • Qt公有槽和私有槽的区别

    Qt遵循C 的规则 当槽函数作为一个成员函数 公有槽可以被其他类调用 而私有槽只能被类自身调用 当槽函数被信号触发而被调用时 公有槽和私有槽没有区别 它们都能被外部信号触发 参考链接 https stackoverflow com ques
  • JavaEE学习记录day11 IO流02 字符流、转换流、Properties集合

    1 字符流 1 1为什么会出现字符流 理解 字符流的介绍 由于字节流操作中文不是特别的方便 所以Java就提供字符流 字符流 字节流 编码表 中文的字节存储方式 用字节流复制文本文件时 文本文件也会有中文 但是没有问题 原因是最终底层操作会
  • 黑幕!阿里P8爆出学透这份算法面试文档,不再怕任何大厂算法题

    为什么要学习数据结构和算法 随着应用程序变得越来越复杂和数据越来越丰富 几百万 几十亿甚至几百亿的数据就会出现 而对这么大对数据进行搜索 插入或者排序等的操作就越来越慢 数据结构就是用来解决这些问题的 阅读本教程前 您需要了解的知识 在您开
  • FastDFS storage服务器安装Nginx

    环境准备 操作系统 Centos 服务器 192 168 60 165 storage服务器 软件包 fastdfs nginx module 1 20 tar gz nginx 1 14 0 tar gz 软件包下载地址 待补充 第一步
  • Hive 窗口函数如何设置窗口大小

    select city year taxes sum money over as sample1 所有行相加 sum money over partition by city as sample2 按city分组 组内数据相加 sum mo
  • Linux下用inotify-tool实时监控服务器文件

    说明 服务器系统 CentOS 文件目录 home web os 实现目的 当 home web os下面除过cache目录之外 任何文件发生变化时 记录日志并保存 具体操作 一 安装Inotify tools工具 1 查看服务器内核是否支
  • Android SurfaceFlinger服务(三) ----- 本地图层Layer创建

    在上一篇文章中 主要分析了Surface的创建过程 对于Layer图层的创建并没有深入跟踪分析 这篇文章将分析Layer图层的创建 并分析handle gbp这两个变量的来源 在SurfaceFlinger中会根据flags的值创建不同的l
  • CMake中include的使用

    CMake中的include命令用于从文件或模块 file or module 加载并运行CMake code 其格式如下 include
  • 【算法】Dijkstra最短路算法

    上周我们介绍了神奇的只有五行的Floyd最短路算法 它可以方便的求得任意两点的最短路径 这称为 多源最短路 本周来来介绍指定一个点 源点 到其余各个顶点的最短路径 也叫做 单源最短路径 例如求下图中的1号顶点到2 3 4 5 6号顶点的最短
  • VS+QT开发Ocx/ActiveX控件 一

    VS QT开发Ocx ActiveX控件 一 VS QT开发Ocx ActiveX控件 网页中全屏 二 QT开发ActiveX控件 一 所用IDE版本 需用管理员权限 二 创建ActiveX 三 qt desinger 四 regsvr32
  • java虚拟机win10_Win10系统启动软件出现Java虚拟机错误的解决方法

    在 1 为Java设置新的系统变量 当Java需要更大的全局最大堆内存大小时 通常会出现Java虚拟机错误 用户通过扩展分配给Java的最大RAM来解决该问题 用户可以通过建立新的Java System Variable来实现 如下所示 使
  • Linux Debian Jenkins快速搭建配置并运行

    Jenkins安装 参考Debian Jenkins Packageshttps pkg origin jenkins io debian stable 加Key curl fsSL https pkg jenkins io debian
  • C++98 auto_ptr智能指针

    auto ptr 是C 98定义的智能指针模板 其定义了管理指针的对象 可以将new获得 直接或间接 的地址赋给这种对象 当对象过期时 其析构函数将使用delete来释放内存 用法 头文件 include
  • chatgpt赋能python:Python金额计算

    Python金额计算 Python是一种高级编程语言 因其易于阅读 简单 灵活和易于学习而广受欢迎 它还具有强大的数学和计算功能 因此 它是一种非常流行的用于金额计算的工具 在本文中 将介绍如何使用Python进行金额计算 包括不同的货币格
  • mysql-client客户端安装

    测试 生产环境中 有时并不需要在本地安装一个mysql server服务 只需要安装一个登录mysql server 的mysql的客户端client centos6系统上安装mysql client的方式 yum install mysq
  • GDI+学习笔记7-统计报表的图形绘制

    图形编程 SetPixel 设置指定点的颜色 COLORREF SetPixel HDC hDC int X int Y COLORREF crColor hDC 绘制点的DC X Y 坐标位置 crColor 设置的颜色 返回值为设置颜色
  • ubuntu虚拟机与windows系统间不能复制粘贴

    sudo tar zxf VMwareTools 10 3 23 17030940 tar gz 这个命令时解压文件 输入 sudo vmware tools distrib vmware install pl 与 vmware tools
  • PHP的进制转换与字符串的编码解码

    目录 一 进制转换函数 dechex hexdec decbin bindec base convert 二 编码解码函数 bin2hex hex2bin pack 和 unpack 三 字符串类型详解 PHP字符串 从PHP 5 2 1版