用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. C#.NET Split 的几种使用方法

    第一种方法: string s = "abcdeabcdeabcde"; string[] sArray = s.Split('c'); foreach (string i in ...

  2. MYSQL 数学运算符问题

    背景: 在mysql中   ’stringA' + 'stringB' 这种类型的操作,在mysql内部会自动转化为两个double 数进行运算. -------------------------- ...

  3. javascript - 工作笔记 (事件四)

    在javascript - 工作笔记 (事件绑定二)篇中,我将事件的方法做了简单的包装,  JavaScript Code  12345   yx.bind(item, "click&quo ...

  4. QT里嵌入Python

    刚看到一个软件,叫做,明明是QT做的,却带了很多pyd文件(Python编译后的文件),上网一查,果然有这套相关的东西: https://doc.qt.io/archives/qq/qq23-pyth ...

  5. AOJ 2249 Road Construction(Dijkstra+优先队列)

    [题目大意] http://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=2249 [题目大意] 一张无向图,建造每条道路需要的费用已经给出, 现 ...

  6. Android的logcat命令详解

    前言          欢迎大家我分享和推荐好用的代码段~~ 声明          欢迎转载,但请保留文章原始出处:          CSDN:http://www.csdn.net        ...

  7. c++编程中的后缀

    .a 静态库 (archive) .C.c.cc.cp.cpp.cxx.c++ C++源代码(需要编译预处理) .h C或者C++源代码头文件 .ii C++源代码(不需编译预处理) .o 对象文件 ...

  8. Little Zu Chongzhi's Triangles

    Little Zu Chongzhi's Triangles Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 512000/512000 ...

  9. tky项目第①个半月总结

    增加tky项目开发组已经有半个月了,这半个月一直是伴随着加班度过,学习了不少东西,也有不少抱怨,这些都是宝贵的工作经验体会.有必要在此好好总结一下. 我是中途加进这个项目的.也就是说.组内其它人员已经 ...

  10. Girl_iOS100天学iOS的第一天(规划)

    不好的开端. 只是还好,总算是開始. 今天一直在做项目中的某个模块,发现自己尽管工作了一段时间,但编码速度还是够慢的 >.< 探究其为什么慢的原因,还是由于自己对某些控件等基础的不熟悉,如 ...