golang仿AS3写的ByteArray
用golang写了个仿AS3写的ByteArray,稍微有点差别,demo能成功运行,还未进行其他测试
主要参考的是golang自带库里的Buffer,结合了binary
来看看demo:
- package main
- import (
- "tbs"
- "fmt"
- )
- func main() {
- var ba *tbs.ByteArray = tbs.CreateByteArray([]byte{})
- ba.WriteBytes([]byte("abc"))
- ba.WriteByte('A')
- ba.WriteBool(true)
- ba.WriteBool(false)
- ba.WriteInt8()
- ba.WriteInt16()
- ba.WriteInt32()
- ba.WriteInt64()
- ba.WriteFloat32(123.456)
- ba.WriteFloat64(456.789)
- ba.WriteString("hello ")
- ba.WriteUTF("world!")
- bytes := make([]byte, )
- fmt.Println(ba.ReadBytes(bytes, , ))
- fmt.Println(ba.ReadByte())
- fmt.Println(ba.ReadBool())
- fmt.Println(ba.ReadBool())
- fmt.Println(ba.ReadInt8())
- fmt.Println(ba.ReadInt16())
- fmt.Println(ba.ReadInt32())
- fmt.Println(ba.ReadInt64())
- fmt.Println(ba.ReadFloat32())
- fmt.Println(ba.ReadFloat64())
- fmt.Println(ba.ReadString())
- fmt.Println(ba.ReadUTF())
- byte,err := ba.ReadByte()
- if err == nil{
- fmt.Println(byte)
- }else{
- fmt.Println("end of file")
- }
- ba.Seek() //back to 3
- fmt.Println(ba.ReadByte())
- ba.Seek() //back to 39
- fmt.Printf("ba has %d bytes available!\n", ba.Available())
- fmt.Println(ba.ReadUTF())
- }
demo中测试所有的方法
付上代码:
- package tbs
- import (
- "encoding/binary"
- "io"
- )
- type ByteArray struct {
- buf []byte
- posWrite int
- posRead int
- endian binary.ByteOrder
- }
- var ByteArrayEndian binary.ByteOrder = binary.BigEndian
- func CreateByteArray(bytes []byte) *ByteArray {
- var ba *ByteArray
- if len(bytes) > {
- ba = &ByteArray{buf: bytes}
- } else {
- ba = &ByteArray{}
- }
- ba.endian = binary.BigEndian
- return ba
- }
- func (this *ByteArray) Length() int {
- return len(this.buf)
- }
- func (this *ByteArray) Available() int {
- return this.Length() - this.posRead
- }
- func (this *ByteArray) SetEndian(endian binary.ByteOrder) {
- this.endian = endian
- }
- func (this *ByteArray) GetEndian() binary.ByteOrder {
- if this.endian == nil {
- return ByteArrayEndian
- }
- return this.endian
- }
- func (this *ByteArray) grow(l int) {
- if l == {
- return
- }
- space := len(this.buf) - this.posWrite
- if space >= l {
- return
- }
- needGrow := l - space
- bufGrow := make([]byte, needGrow)
- this.buf = Merge(this.buf, bufGrow)
- }
- func (this *ByteArray) SetWritePos(pos int) error{
- if pos > this.Length(){
- this.posWrite = this.Length()
- return io.EOF
- }else{
- this.posWrite = pos
- }
- return nil
- }
- func (this *ByteArray) SetWriteEnd(){
- this.SetWritePos(this.Length())
- }
- func (this *ByteArray) GetWritePos() int{
- return this.posWrite
- }
- func (this *ByteArray) SetReadPos(pos int) error{
- if pos > this.Length(){
- this.posRead = this.Length()
- return io.EOF
- }else{
- this.posRead = pos
- }
- return nil
- }
- func (this *ByteArray) SetReadEnd(){
- this.SetReadPos(this.Length())
- }
- func (this *ByteArray) GetReadPos() int{
- return this.posRead
- }
- func (this *ByteArray) Seek(pos int) error{
- err := this.SetWritePos(pos)
- this.SetReadPos(pos)
- return err
- }
- func (this *ByteArray) Reset() {
- this.buf = []byte{}
- this.Seek()
- }
- func (this *ByteArray) Bytes() []byte {
- return this.buf
- }
- func (this *ByteArray) BytesAvailable() []byte {
- return this.buf[this.posRead:]
- }
- //==========write
- func (this *ByteArray) Write(bytes []byte) (l int, err error) {
- this.grow(len(bytes))
- l = copy(this.buf[this.posWrite:], bytes)
- this.posWrite += l
- return l, nil
- }
- func (this *ByteArray) WriteBytes(bytes []byte) (l int, err error) {
- return this.Write(bytes)
- }
- func (this *ByteArray) WriteByte(b byte) {
- bytes := make([]byte, )
- bytes[] = b
- this.WriteBytes(bytes)
- }
- func (this *ByteArray) WriteInt8(value int8) {
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteInt16(value int16){
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteInt32(value int32){
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteInt64(value int64){
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteFloat32(value float32){
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteFloat64(value float64){
- binary.Write(this, this.endian, &value)
- }
- func (this *ByteArray) WriteBool(value bool){
- var bb byte
- if value {
- bb =
- } else {
- bb =
- }
- this.WriteByte(bb)
- }
- func (this *ByteArray) WriteString(value string){
- this.WriteBytes([]byte(value))
- }
- func (this *ByteArray) WriteUTF(value string){
- this.WriteInt16(int16(len(value)))
- this.WriteBytes([]byte(value))
- }
- //==========read
- func (this *ByteArray) Read(bytes []byte) (l int, err error){
- if len(bytes) == {
- return
- }
- if len(bytes) > this.Length() - this.posRead{
- return , io.EOF
- }
- l = copy(bytes, this.buf[this.posRead:])
- this.posRead += l
- return l, nil
- }
- func (this *ByteArray) ReadBytes(bytes []byte, length int, offset int) (l int, err error){
- return this.Read(bytes[offset:offset + length])
- }
- func (this *ByteArray) ReadByte() (b byte, err error){
- bytes := make([]byte, )
- _, err = this.ReadBytes(bytes, , )
- if err == nil{
- b = bytes[]
- }
- return
- }
- func (this *ByteArray) ReadInt8() (ret int8, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadInt16() (ret int16, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadInt32() (ret int32, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadInt64() (ret int64, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadFloat32() (ret float32, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadFloat64() (ret float64, err error){
- err = binary.Read(this, this.endian, &ret)
- return
- }
- func (this *ByteArray) ReadBool() (ret bool, err error){
- var bb byte
- bb, err = this.ReadByte()
- if err == nil{
- if bb == {
- ret = true
- } else {
- ret = false
- }
- }else{
- ret = false
- }
- return
- }
- func (this *ByteArray) ReadString(length int) (ret string, err error){
- bytes := make([]byte, length)
- _, err = this.ReadBytes(bytes, length, )
- if err == nil{
- ret = string(bytes)
- }else{
- ret = "";
- }
- return
- }
- func (this *ByteArray) ReadUTF() (ret string, err error){
- var l int16
- l, err = this.ReadInt16()
- if err != nil{
- return "", err
- }
- return this.ReadString(int(l))
- }
我用两个游标来控制,你可能会不习惯,但用起来会更加灵活!
我现在已经把ByteArray放在我的项目中了,已经完全整合进去了。
(如果要用这个类,那你可以做任意修改)
贴上我自己的博客地址:http://blog.codeforever.net/
golang仿AS3写的ByteArray的更多相关文章
- WIFI_仿手机写wifi应用程序_WDS
2-1.1_15节_使用WIFI网卡6_仿手机写wifi操作程序============================== 1. 仿手机写一个WIFI操作程序,作为STA,有这几个功能:a. 自动扫 ...
- 仿flask写的web框架
某大佬仿flask写的web框架 web_frame.py from werkzeug.local import LocalStack, LocalProxy def get_request_cont ...
- As3截图转换为ByteArray传送给后台node的一种方法
最近将以前用As3+Php做的一个画板拿出来改成了As3+nodejs(expressjs4). Node: 1. 将图片存放的路径设置为静态公开的路径. app.use(express.static ...
- windows从0开始学golang--0--安装golang+git+自己写包
windows下 1.安装golang 2.安装git(主要是go get 引用git上的包) 3. 使用默认安装生成的目录 pkg:包含包对象,编译好的库文件 src:包含 Go 源文件,注意:你 ...
- golang 仿python pack/unpack
写得不完善也不完美 尤其是高低位转换那(go和c 二进制高地位相反 需要转换,还有go int转[]byte长度是4位),希望牛人看后指导一下 项目需要通过socket调取 客户端是go ,服务器端是 ...
- Golang学习---test写法和benchmark写法
一.Test 1. 每一个test文件须import一个testing 2. test文件下的每一个test case 均必须用Test开头并且符合TestXxxx形式,否则go test会直接跳过测 ...
- 仿log4j 写 log 代码
log4j 一直有个问题无法满足我,有可能我还不知道怎么去使用它. 就是他会把项目中所有的日志信息都记到一个文件里面,而业务系统往往需要根据某个业务流程查看日志分析. public class Bus ...
- Golang仿云盘项目-2.2 保留文件元信息
本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html 目录结构 E:\goproj\FileStorage ...
- [转]关于AS3 Socket和TCP不得不说的三两事
磨刀不误砍柴工,让我们从概念入手,逐步深入. 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...
随机推荐
- jquery实现div垂直居中
<html> <head> <meta charset="UTF-8"> <title></title> <scr ...
- Android Studio 打包流程
(1)Android Studio菜单Build->Generate Signed APK (2)弹出窗口 (3)创建密钥库及密钥,创建后会自动选择刚创建的密钥库和密钥(已拥有密钥库跳过) ...
- 在win8.1下安装laravel5.1时碰到的坑不少,但总算搞掂,真有点不容易。
安装好php后,安装laravel的方法有如下几种. 1.先安装好composer, 再用composer下载资源并安装,命令如下: composer create-project laravel/l ...
- phpcms在自定义模块中的自定义标签分页
如果你是一个经验丰富的phpcms二次开发人员,本篇文章可以忽略不计,因为这里的写法自己都觉得很恶心 今天在开发一个网站自建了一个模块叫做论坛模块,目录名称:luntan ...
- undo_retention:确定最优的撤销保留时间
使用下面的公式来计算undo_retention参数的值: undo_retention=undo size/(db_block_size * undo_block_per_sec) 可以通过提交下面 ...
- EL表达式(转)
转自:http://www.cnblogs.com/Fskjb/archive/2009/07/05/1517192.html EL 全名为Expression Language EL 语法很简单,它 ...
- Oracle EBS-SQL (BOM-8):检查物料属性(无采购员).sql
select msi.segment1 物料编码, msi.DESCRIPTION ...
- SQL PLUS远程连接
http://blog.csdn.net/wildin/article/details/5850252 这篇文章无敌了. Oracle sqlplus添加历史记录功能: http://www.cnbl ...
- javascript预加载和延迟加载
延迟加载javascript,也就是页面加载完成之后再加载javascript,也叫on demand(按需)加载,一般有一下几个方法: What can your tired old page, o ...
- 用ATL和MFC来创建ActiveX控件
摘要:目前MFC和ATL代表了两种框架,分别面向不同类型的基于Windows的开发.MFC代表了创建独立的Windows应用的一种简单.一致的方法:ATL提供了一种框架来实现创建COM客户机和服务器所 ...