lua string.pack string.unpack

在了解string.pack string.unpack 之前,先了解⼀下 ⼤端编码和⼩端编码
⼤端字节序(⽹络字节序) 和 ⼩端字节序(主机字节序)
⼤端就是将⾼位字节放到内存的低地址端,低位字节放到⾼地址端。⽹络传输中(⽐如TCP/IP)低地址端(⾼位字节)放在流的开始,对于2个
字节的字符串(ab),传输顺序为:a(0-7bit)、b(8-15bit)。
之所以⼜称为 ⽹络字节序,是因为⽹络传输时,默认是⼤端编码传输的。
如果把计算机的内存看做是⼀个很⼤的字节数组,⼀个字节包含 8 bit 信息可以表⽰ 0-255 的⽆符号整型,以及 -128—127 的有符号整
型。当存储⼀个⼤于 8 bit 的值到内存时,这个值常常会被切分成多个 8 bit 的 segment 存储在⼀个连续的内存空间,⼀个 segment ⼀
个字节。有些处理器会把⾼位存储在内存这个字节数组的头部,把低位存储在尾部,这种处理⽅式叫 ⼤端字节序 ,有些处理器则相反,低
位存储在头部,⾼位存储在尾部,称之为 ⼩端字节序 。
lua string.pack string.unpack
函数 pack 负责将不同的变量打包在⼀起,成为⼀个字节字符串。
函数 unpack 将字节字符串解包成为变量。
 

--------------------------------------------------------
字节符 b 打包解包 pack(“b”,str) unpack(“b”,str)

local unpack = string.unpack
local pack = string.pack
local str1 = pack(">b",-128) --最⼩⽀持 -128
local str2 = pack("<b",127) --最⼤⽀持 127
--如果把 pack("b",127) 改为 pack("b",128),就会出现下⾯的错误
--bad argument #2 to 'pack' (integer overflow),意思是pack的第⼆个参数整型溢出了
print(unpack(">b", str1)) --输出-128  2 ,这个2表⽰下⼀个字节的位置
print(unpack("<b", str2)) --输出127  2 ,这个2表⽰下⼀个字节的位
--------------------------------------------------------
字节符 B 打包解包 pack(“B”,str) unpack(“B”,str)

local str1 = pack("B",0) --最⼩⽀持 0
local str2 = pack("B",255) --最⼤⽀持 255
--如果改为 pack("B",-1) 或者 pack("B",256),就会出现下⾯的错误
--bad argument #2 to 'pack' (unsigned overflow),意思是pack的第⼆个参数类型溢出了
print(unpack("B", str1)) --输出0  2 ,这个2表⽰下⼀个字节的位置
print(unpack("B", str2)) --输出255  2 ,这个2表⽰下⼀个字节的位置
--------------------------------------------------------
字节符 H 打包解包 pack(“H”,str) unpack(“H”,str)

--H 表⽰short,在32位平台下如windows(32位)中⼀般为16位
local str1 = pack("H",0) --最⼩⽀持 0
local str2 = pack("H",65535) --最⼤⽀持 65535
--如果改为 pack("H",-1) 或者 pack("H",65536),就会出现下⾯的错误
--bad argument #2 to 'pack' (unsigned overflow),意思是pack的第⼆个参数类型溢出了
print(unpack("H", str1)) --输出0  3 ,这个3表⽰下⼀个short的位置,每个short占2字节
print(unpack("H", str2)) --输出65535  3 ,这个3表⽰下⼀个short的位置
--------------------------------------------------------
字节符 h 打包解包 pack(“h”,str) unpack(“h”,str)

local str1 = pack("h",-32768) --最⼩⽀持 -32768
local str2 = pack("h",32767) --最⼤⽀持 32767
--如果改为 pack("H",-32769) 或者 pack("H",32768),就会出现下⾯的错误
--bad argument #2 to 'pack' (integer overflow),意思是pack的第⼆个参数溢出了
print(unpack("h", str1)) --输出-32768  3 ,这个3表⽰下⼀个short的位置,每个short占2字节
print(unpack("h", str2)) -- 32767  3 ,这个3表⽰下⼀个short的位置
--------------------------------------------------------
字节符 I 打包解包 pack(“I”,str) unpack(“I”,str)

-- I默认是占4字节,但是可以给I指定字节数,如 I2 就是占2字节,I3占3字节
local str1 = pack("I",0) --最⼩⽀持 0
local str2 = pack("I",4294967295) --最⼤⽀持 4294967295
--如果改为 pack("I",-1) 或者 pack("I",4294967296),就会出现下⾯的错误
--bad argument #2 to 'pack' (unsigned overflow),意思是pack的第⼆个参数类型溢出了
print(unpack("I", str1)) --输出0  5 ,这个5表⽰下⼀个字节的位置,I 默认占4字节
print(unpack("I", str2)) --输出4294967295  5 ,这个5表⽰下⼀个字节的位置
local str3 = pack("I2",0) --最⼩⽀持 0
local str4 = pack("I2",65535) --最⼤⽀持 4294967295
print(unpack("I2", str3)) --输出0  3 ,这个3表⽰下⼀个字节的位置,I2 占2字节
print(unpack("I2", str4)) --输出4294967295  3 ,这个3表⽰下⼀个字节的位置
local str5 = pack("I3",0) --最⼩⽀持 0
local str6 = pack("I3",16777215) --最⼤⽀持 16777215
print(unpack("I3", str5)) --输出 0  4 ,这个4表⽰下⼀个字节的位置,I3 占3字节
print(unpack("I3", str6)) --输出 16777215  4 ,这个4表⽰下⼀个字节的位置
--------------------------------------------------------
字节符 c 打包解包 pack(“c”,str) unpack(“c”,str)

-- c 表⽰⼀个字节
local str1 = pack("c1",'a') --表⽰最⼤⽀持1个字节的字符
print('#str1',#str1) --输出 #str1 1
--如果改为 pack("c1",'aa') ,就会出现如下的错误
--bad argument #2 to 'pack' (string longer than given size)
local str2 = pack("c5",1) --表⽰最⼤⽀持5个字节的字符
print('#str2',#str2) --输出 #str2 5
print(unpack("c1", str1)) --输出a  2 ,这个2表⽰下⼀个字节的位置,c1 占1字节
print(unpack("c5", str2)) --输出1  6 ,这个6表⽰下⼀个字节的位置,c5 占5字节
--------------------------------------------------------
字节符 s 打包解包 pack(“s”,str) unpack(“s”,str)

-- s,可指定头部占⽤字节数,默认占8字节
local temp1 = pack("s",'a')
print(unpack('s', temp1))
--输出 a    10,这个10表⽰下⼀个字符的位置
local temp2 = pack("s",'abc')
print(unpack('s', temp2))
--输出 abc 12,这个12表⽰下⼀个字符的位置
local temp3 = pack("ss",'abc','efg')
print(unpack('s', temp3, 12))
--输出 efg 23,这个23表⽰下⼀个字符的位置
-- s 默认头部占8字节,s1表⽰头部占1字节、s2表⽰头部占2字节
local temp4 = pack("s2",'abc')
print(unpack('s2', temp4))
--输出 abc    6,这个6表⽰下⼀个字符的位置
local temp5 = pack("s2s2",'abc','efg')
print(unpack('s2', temp5, 6))
--输出 efg 11,这个11表⽰下⼀个字符的位置
--------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值