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表⽰下⼀个字符的位置
--------------------------------------------------------

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Lua 中的 `string.pack` 和 `string.unpack` 函数是用于将数据打包成二进制数据和从二进制数据中解析出数据的函数。这两个函数通常用于网络通信、文件存储等需要将数据转换为二进制数据的场景。 `string.pack` 函数将多个参数按照指定的格式字符串进行打包,并返回一个二进制字符串。格式字符串中可以包含各种类型的占位符,例如 `%d` 表示一个整数、`%f` 表示一个浮点数、`%s` 表示一个字符串等。打包时,每个占位符对应一个参数,按顺序进行打包。示例如下: ```lua local data = string.pack("c4ihfd", "test", 1234, 5678, 3.14, 2.718) ``` 在这个示例中,格式字符串 `"c4ihfd"` 包含了 6 个占位符,分别表示一个长度为 4 的字符串、一个短整数、一个整数、一个双精度浮点数和一个单精度浮点数。`string.pack` 函数接收 6 个参数,按照顺序进行打包,并返回一个二进制字符串。 `string.unpack` 函数将一个二进制字符串按照指定的格式字符串进行解析,并返回解析出的值。格式字符串和 `string.pack` 函数中的格式字符串相同。解析时,每个占位符对应一个返回值,按顺序进行解析。示例如下: ```lua local str, i, j, x, y = string.unpack("c4ihfd", data) ``` 在这个示例中,`string.unpack` 函数接收一个格式字符串和一个二进制字符串作为参数,解析出 5 个值,并按顺序返回。 需要注意的是,在使用 `string.pack` 和 `string.unpack` 函数时,需要按照指定的格式字符串进行打包和解析,否则可能会导致数据解析错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值