在本文中,我们将为您详细介绍用lua实现ByteArray和ByteArrayVarint的相关知识,并且为您解答关于luastringbyte的疑问,此外,我们还会提供一些关于5——深浅复制、byt
在本文中,我们将为您详细介绍用lua实现ByteArray和ByteArrayVarint的相关知识,并且为您解答关于lua string byte的疑问,此外,我们还会提供一些关于5——深浅复制、bytes和bytearray、linux用户、actionscript-3 – 如何将bytearray转换为图像或图像到bytearray?、ByteArrayInputStream与ByteArrayOutputStream、ByteArrayOutputStream和ByteArrayInputStream详解的有用信息。
本文目录一览:- 用lua实现ByteArray和ByteArrayVarint(lua string byte)
- 5——深浅复制、bytes和bytearray、linux用户
- actionscript-3 – 如何将bytearray转换为图像或图像到bytearray?
- ByteArrayInputStream与ByteArrayOutputStream
- ByteArrayOutputStream和ByteArrayInputStream详解
用lua实现ByteArray和ByteArrayVarint(lua string byte)
- 本站文章除注明转载外,均为本站原创或者翻译。
- 本站文章欢迎各种形式的转载,但请18岁以上的转载者注明文章出处,尊重我的劳动,也尊重你的智商;
- 本站部分原创和翻译文章提供markdown格式源码,欢迎使用文章源码进行转载;
- 本文标题:用lua实现ByteArray和ByteArrayVarint
- 本文链接:http://zengrong.net/post/1968.htm
用lua实现ByteArray和ByteArrayVarint
2014-01-10更新: ByteArray 和 ByteArrayVarint 已经进入 quick-cocos2d-x 的 framework.
许多 Actionscript 程序员已经从 Flash 转到 Cocos2d-x 了。那么以前的那些超级好用的类库都不见了,只好重新来过。
我利用 Lua 和 lpack 库实现了一套 lua版本的 ByteArray 。这套库用于 quick-cocos2d-x(后称quick) 中。因此依赖一些 quick 中已经包含的c库和lua库 。
主要依赖如下:
- lpack (已经包含在quick中)
- BitOp (已经包含在quick中)
- quick framework
utils.ByteArray
ByteArray依赖 lpack 。
lpack 其实已经足够好用了。但是由于lpack的指针功能有限,所以使用起来还是有些麻烦。这个类模仿了 Actionscript 的 flash.utils.ByteArray ,指针在内部实现,方便读取和缓存 socket 服务器数据。
当然了,有一点点不同,但或许更好用。
下面是使用ByteArray的例子:
-- 直接使用 lpack 库生成一个字节流 local __pack = string.pack("<bihP2", 0x59, 11, 1101, "", "中文") -- 创建一个ByteArray local __ba = ByteArray.new() -- ByteArray 允许直接写入 lpack 生成的字节流 __ba:writeBuf(__pack) -- 不要忘了,lua数组是1基的。而且函数名称比 position 短 __ba:setPos(1) -- 这个用法和AS3相同了,只是有些函数名称被我改掉了 print("ba.len:", __ba:getLen()) print("ba.readByte:", __ba:readByte()) print("ba.readInt:", __ba:readInt()) print("ba.readShort:", __ba:readShort()) print("ba.readString:", __ba:readStringUShort()) print("ba.available:", __ba:getAvailable()) -- 自带的toString方法可以以10进制、16进制、8进制打印 print("ba.toString(16):", __ba:toString(16)) -- 创建一个新的ByteArray local __ba2 = ByteArray.new() -- 和AS3的用法相同,还支持链式调用 __ba2:writeByte(0x59) :writeInt(11) :writeShort(1101) -- 写入空字符串 __ba2:writeStringUShort("") -- 写入中文(UTF8)字符串 __ba2:writeStringUShort("中文") -- 十进制输出 print("ba2.toString(10):", __ba2:toString(10))
下面就是效果了:
utils.ByteArrayVarint
ByteArrayVarint 继承 ByteArray,同时依赖 BitOp。
ByteArrayVarint 实现了 google protocol buffer协议中的Varint编码 。
Protocol Buffer协议是何方神圣,google一下就知道。简单说就是能大幅降低 socket 协议中传递的字节流的长度。但是protocol buffer协议还包含许多东西,而我只需要 varint 编码而已。
我们的上一个游戏就在 AS3中实现了varint编码 。现在又用lua实现了一遍。
方法名称 | 说明 |
---|---|
ByteArrayVarint.readUVInt() | read a unsigned varint int |
ByteArrayVarint.writeUVInt() | write a unsigned varint int |
ByteArrayVarint.readVInt() | read varint int |
ByteArrayVarint.writeVInt() | write varint int |
ByteArrayVarint.readStringUVInt() | read a string preceding a unsigned varint int |
ByteArrayVarint.writeStringUVInt() | write a string preceding a unsigned varint int |
虽然lua支持64位数字,但由于 BitOp 仅支持32位有符号整数,这个 ByteArrayVarint 类能做的事情有限,甚至比AS3的都要差点(AS3好歹还支持32位无符号整数)。但如果程序中不使用变态的64位(或更高)数字的话,还是挺好的。
我会把自己在游戏中常用的 lua 功能陆续整合进入这个开源库,就像我的 as3库 和 java库 一样。
关联文章
- quick-cocos2d-x 中的 socket 技术选择:LuaSocket 和 WebSocket
- 在 quick-cocos2d-x 中导出 CCFileUtils::getFileData 给Lua使用
- 比较Object/Dictionary/Array顺序读写性能
- 在Bash中将字符串拆分成数组
- 使用 ZeroBrane Studio 和 Eclipse LDT 断点调试 quick-cocos2d-x
5——深浅复制、bytes和bytearray、linux用户
深浅复制
深浅复制只有在列表嵌套列表的情况下讨论
如果想保留修改之前的数据,就可以使用列表的复制,但要注意列表嵌套情况下的问题
l1 = [1,[2, 3]]
l2 = l1.copy()
#copy 浅复制 随着l1或l2的改变而发生改变
#浅复制只能改变第一层列表的数据,不能改变列表中嵌套的数据
import copy
l3 = copy.deepcopy(l1)
#深复制 能改变列表中所有嵌套的数据
bytes二进制序列类型
01 指定长度的零填充字节对象:
[in] bytes(3)
[out] b''\x00\x00\x00''
02 二进制字符串对象:
[in] bytes(b''abc'')
[out] b''abc
bytearray二进制数组
01 指定长度的零填充字节对象:
bytearray(3)
02 二进制字符串对象:
bytearray(b''abc'')
Linux用户
查看所有用户:
cat /etc/passwd
#将用户保存至文件中
cat /etc/passwd > user.list
''>''输出定向(覆盖)
''>>''追加进去
1:属主 2:用户组里边的其他用户 3:其他用户组
(4)r:可读 (2)w:可写 (1)x:可执行 (7)rwx(全部权限)
#修改权限执行代码
chmod 000 a.py
对可执行(x)文件进行执行
./a.py
无法直接执行时需要在vim里面加入 #!/usr/bin/python3
用户名称:用户密码:用户标记号:组标记号:相关注释:主目录:使用的Shell
在Linux中有三种用户,超级用户、系统用户和普通用户:
超级用户:就是root用户,具有超级权限,可以操作任何文件,日常使用中应该避免使用它, 在ubuntu中root用户默认没有隐藏,自动生成随机密码
系统用户:是系统正常使用时使用的账户,如bin、mail等,但是系统用户不能够登录
普通用户:是普通使用者,能够使用Linux大部分资源,但是一些特定的权限受到控制
用户组:
Linux中除啦用户之外还有用户组的概念,用户组就是具有相同特征的用户的用户集合。每个用户都有对应的用户组
查看用户组:
cat /etc/group
actionscript-3 – 如何将bytearray转换为图像或图像到bytearray?
我有面板控件,并希望从webservice加载图像作为backgroundimage.所以我使用setstyle()但不接受该图像.所以如何将该图像添加到我的面板背景图像中.请在此处告诉我您的想法.
解决方法
yourImage.source = yourByteArray;
问候!
ByteArrayInputStream与ByteArrayOutputStream
第一次看到ByteArrayOutputStream的时候是在Nutch的部分源码,后来在涉及IO操作时频频发现这两个类的踪迹,觉得确实是很好用,所以把它们的用法总结一下。
ByteArrayOutputStream的用法
以下是JDK中的记载:
public class ByteArrayOutputStream extends OutputStream
此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString()获取数据。
关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。
我的个人理解是ByteArrayOutputStream是用来缓存数据的(数据写入的目标(output stream原义)),向它的内部缓冲区写入数据,缓冲区自动增长,当写入完成时可以从中提取数据。由于这个原因,ByteArrayOutputStream常用于存储数据以用于一次写入。
实例:
从文件中读取二进制数据,全部存储到ByteArrayOutputStream中。
FileInputStream fis=new FileInputStream("test");
BufferedInputStream bis=new BufferedInputStream(fis);
ByteArrayOutputStream baos=new ByteArrayOutputStream();
int c=bis.read();//读取bis流中的下一个字节
while(c!=-1){
baos.write(c);
c=bis.read();
}
bis.close();
byte retArr[]=baos.toByteArray();
ByteArrayInputStream的用法
相对而言,ByteArrayInputStream比较少见。先看JDK文档中的介绍:
public class ByteArrayInputStreamextends InputStreamByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。内部计数器跟踪 read 方法要提供的下一个字节。
关闭 ByteArrayInputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
构造函数:
ByteArrayInputStream(byte[] buf)
注意它需要提供一个byte数组作为缓冲区。
与大部分Inputstream的语义类似,可以从它的缓冲区中读取数据,所以我们可以在它的外面包装另一层的inputstream以使用我们需要的读取方法。
个人认为一个比较好的用途是在网络中读取数据包,由于数据包一般是定长的,我们可以先分配一个够大的byte数组,比如byte buf[]=new byte[1024];
然后调用某个方法得到网络中的数据包,例如:
Socket s=...;
DataInputStream dis=new DataInputStream(s.getInputStream());
dis.read(buf);//把所有数据存到buf中
ByteArrayInputStream bais=new ByteArrayInputStream(buf); //把刚才的部分视为输入流
DataInputStream dis_2=new DataInputStream(bais);
//现在可以使用dis_2的各种read方法,读取指定的字节
比如第一个字节是版本号,dis_2.readByte();
等等……
上面的示例的两次包装看上去有点多此一举,但使用ByteArrayInputStream的好处是关掉流之后它的数据仍然存在。
ByteArrayOutputStream和ByteArrayInputStream详解
ByteArrayOutputStream类是在创建它的实例时,程序内部创建一个byte型别数组的缓冲区,然后利用ByteArrayOutputStream和ByteArrayInputStream的实例向数组中写入或读出byte型数据。在网络传输中我们往往要传输很多变量,我们可以利用ByteArrayOutputStream把所有的变量收集到一起,然后一次性把数据发送出去。具体用法如下:ByteArrayOutputStream: 可以捕获内存缓冲区的数据,转换成字节数组。
ByteArrayInputStream: 可以将字节数组转化为输入流

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

如上所示,ByteArrayOutputStream把内存中的数据读到字节数组中,而ByteArrayInputStream又把字节数组中的字节以流的形式读出,实现了对同一个字节数组的操作.
综合DataOutputStream&DataInputStream的作用和功能,与ByteArrayOutputStream和ByteArrayInputSream使用将更方便.此时DataOutputStream&DataInputStream封闭了字节流,以适当的形式读出了字节数组中的数据.如下所示:

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

关于用lua实现ByteArray和ByteArrayVarint和lua string byte的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于5——深浅复制、bytes和bytearray、linux用户、actionscript-3 – 如何将bytearray转换为图像或图像到bytearray?、ByteArrayInputStream与ByteArrayOutputStream、ByteArrayOutputStream和ByteArrayInputStream详解等相关内容,可以在本站寻找。
本文标签: