用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的更多相关文章

  1. WIFI_仿手机写wifi应用程序_WDS

    2-1.1_15节_使用WIFI网卡6_仿手机写wifi操作程序============================== 1. 仿手机写一个WIFI操作程序,作为STA,有这几个功能:a. 自动扫 ...

  2. 仿flask写的web框架

    某大佬仿flask写的web框架 web_frame.py from werkzeug.local import LocalStack, LocalProxy def get_request_cont ...

  3. As3截图转换为ByteArray传送给后台node的一种方法

    最近将以前用As3+Php做的一个画板拿出来改成了As3+nodejs(expressjs4). Node: 1. 将图片存放的路径设置为静态公开的路径. app.use(express.static ...

  4. windows从0开始学golang--0--安装golang+git+自己写包

    windows下 1.安装golang 2.安装git(主要是go get 引用git上的包) 3.  使用默认安装生成的目录 pkg:包含包对象,编译好的库文件 src:包含 Go 源文件,注意:你 ...

  5. golang 仿python pack/unpack

    写得不完善也不完美 尤其是高低位转换那(go和c 二进制高地位相反 需要转换,还有go int转[]byte长度是4位),希望牛人看后指导一下 项目需要通过socket调取 客户端是go ,服务器端是 ...

  6. Golang学习---test写法和benchmark写法

    一.Test 1. 每一个test文件须import一个testing 2. test文件下的每一个test case 均必须用Test开头并且符合TestXxxx形式,否则go test会直接跳过测 ...

  7. 仿log4j 写 log 代码

    log4j 一直有个问题无法满足我,有可能我还不知道怎么去使用它. 就是他会把项目中所有的日志信息都记到一个文件里面,而业务系统往往需要根据某个业务流程查看日志分析. public class Bus ...

  8. Golang仿云盘项目-2.2 保留文件元信息

    本文来自博客园,作者:Jayvee,转载请注明原文链接:https://www.cnblogs.com/cenjw/p/16459817.html 目录结构 E:\goproj\FileStorage ...

  9. [转]关于AS3 Socket和TCP不得不说的三两事

    磨刀不误砍柴工,让我们从概念入手,逐步深入. 所谓socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.应用程序通常通过"套接字"向网络 ...

随机推荐

  1. 批量处理csv格式转换成xls

    结合下面的代码学习相关模块及函数方法的使用 #coding:utf-8 #导入相应模块 import csv import xlwt import sys import os import fnmat ...

  2. 让QT对话框显示中文

    http://blog.sina.com.cn/s/blog_8254427901011fxv.html (1)从QT安装目录下面将文件“qt_zh_CN.qm”复制一份到你的项目目录下. 例如,我是 ...

  3. 查看Linux下网卡状态或 是否连接

    分类: 1) 通过mii-tool指令       [root@localhost root]# mii-tool        eth0: negotiated 100baseTx-FD, link ...

  4. laravel5.1框架简介及安装

    最近自己出来实习了,进入了一个新的环境,不仅是生活中,在代码和架构中也完全是一个新的架构.由于公司使用laravel5.1框架,所以最近学习了laravel5.1框架,好了接下来就简单介绍一下lara ...

  5. 有关于/home出现100%被占用 与 vnc的关系

    我在远程服务器时,通常使用的程序是vnc.因为vnc可以图形化界面,操作效果比用putty好很多. 但是,我发现使用vnc有一个问题,就是/home占用空间会达到100%. [zy@islab62 ~ ...

  6. IOS研究院之打开照相机与本地相册选择图片

    如下图所示 在本地相册中选择一张图片后,我们将他拷贝至沙盒当中,在客户端中将它的缩略图放在按钮旁边,这个结构其实和新浪微薄中选择图片后的效果一样.最终点击发送将按钮将图片2进制图片上传服务器. 下面我 ...

  7. haproxy hdr_beg 配置

    v-dev-app01:/root# ping www.zjdev.com PING www.zjdev.com (192.168.32.16) 56(84) bytes of data. 64 by ...

  8. 一个js爬虫

    1. 第一个demo 2. configs详解——之成员 3. configs详解——之field 4. configs详解——之site, page和console 5. configs详解——之回 ...

  9. 小窍门:变更Windows Azure Websites自带的node.exe版本

    这几天在玩node.js.Azure Websites天然支持node.js(还支持.net, php和python).   它对nodejs支持的原理是: IIS充当Web服务器,接收所有的请求,而 ...

  10. chroot_local_user和chroot_list_enable含义

    很多情况下,我们希望限制ftp用户只能在其主目录下(root dir)下活动,不允许他们跳出主目录之外浏览服务器上 的其他目录,这时候我就需要使用到chroot_local_user,chroot_l ...