用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. 关于css3的背景切割(background-clip)、背景原点(background-origin)的使用

    一.背景切割   background-clip :border-box | padding-box | content-box   作用:为将背景图片做适当的裁剪,以适应需要.   默认格式 bac ...

  2. Flink Program Guide (3) -- Event Time (DataStream API编程指导 -- For Java)

    Event Time 本文翻译自DataStream API Docs v1.2的Event Time ------------------------------------------------ ...

  3. web2py官方文档翻译

    00前言 我相信能够轻松地构建高质量增长的web应用程序是至关重要的一个自由和开放的社会.这可以防止玩家最大的垄断信息的流通. 因此我从2007年开始web2py项目,主要是作为一种教学工具与简化we ...

  4. Stack的实现

    public class MyStack<AnyType> { private AnyType [] theItems; private final int DEFAULT_CAPACIT ...

  5. cocos2d-x中常见的场景切换

    本文转载自:http://www.cnblogs.com/linux-ios/archive/2013/04/09/3010779.html bool HelloWorld::init() { /// ...

  6. SQL Server 改变数据库的名字

    方法 1: alter database modiry name = new_database_name; ---------------------------------------------- ...

  7. perl 正则命名捕获

    #!/usr/bin/perl -w =pod 命名捕获--给匹配上的内容加上标签 捕获到的内容都会保存在%+散列中,这个散列的key为对应的标签: 方便之处就是利于程序扩展和阅读,不用繁琐的一个一个 ...

  8. android 开发代码被黑客破译有那么容易吗?

    很多程序员辛辛苦苦开发出的android开发代码,很容易就被黑客翻译了. Google似乎也发现了这个问题,从SDK2.3开始我们可以看到在android-sdk-windows\tools\下面多了 ...

  9. Hadoop-Yarn-框架原理及运作机制(原理篇)

    文件为转载:http://blog.csdn.net/liuwenbo0920/article/details/43304243 一.YARN基本架构 YARN是Hadoop 2.0中的资源管理系统, ...

  10. 使用扩展名获取mimetype

    在Android中很多时候我们需要计算出文件的mimetype,而我们通常的思路就是通过扩展名来获取对应的mimetype,而如果自行处理,将维护一个比较大的映射表,而实际上大可不必,Android提 ...