lua学习笔记之位及字节

1、位操作

& 位与

| 位或

~ 位取反(异或)

>> 逻辑右移

<< 左移

print(string.format("%x", 0xff & 0xabcd))
print(string.format("%x", 0xff | 0xabcd))
print(string.format("%x", 0xaaaa ~ -1))
print(string.format("%x", ~0))

输出:
cd
abff
ffffffffffff5555
ffffffffffffffff

lua中的位数是64。负数偏移表示向相反方向,a >> n相当于a << -n

2、无符号整数

x = 3 << 62
print(x)
print(string.format("%u", x))
print(string.format("0x%X", x))

输出:
-4611686018427387904
13835058055282163712
0xC000000000000000

默认比较是有符号,无符号比较通过math.ult

3、打包和解包二进制数据

分别使用string.pack和string.unpack,其第一个参数表示格式化字符串,其中string.unpack还会返回在最后项之后的位置,string.unpack的第三个参数表示从哪个位置开始读

3.1 整数类型

格式化字符串支持

bchar
hshort
iint
llong
j使用Lua整数的大小

如果使用固定的,与机器无关的大小,使用前缀i选项外加1-16的整数。

每个选项有其大写版本,表示无符号的。对于无符号的,还有T选项,表示size_t

3.2 字符串类型

格式化字符串支持形式有

z\0结束的字符串
 cn固定长度的字符串,其中n表示所占的字节数
sn具有显示长度的字符串,先存储字符的长度,其中n表示用于存储长度的大小
s = string.pack("s1", "hello")
for i = 1, #s do
    print((string.unpack("B", s, i)))
end

输出:
5
104
101
108
108
111

3.3 浮点型

支持的有

f单精度
d双精度
nLua浮点类型

3.4 大小端格式

>大端字节序(网络字节序)
<小端字节序
=默认机器字节序
print(string.format("%x", 1000000))
s = string.pack(">i4", 1000000)
for i = 1, #s do
    print((string.unpack("B", s, i)))
end

输出:
f4240
0
15
66
64

print(string.format("%x %x", 500, 24))
s = string.pack("<i2 i2", 500, 24)
for i = 1, #s do
    print((string.unpack("B", s, i)))
end

输出:
1f4 18
244
1
24
0

3.5 对齐

!n 以n的整数倍对齐

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kgduu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值