分享
  1. 首页
  2. 文章

golang仿AS3写的ByteArray

rockyf · · 5916 次点击 · · 开始浏览
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

用golang写了个仿AS3写的ByteArray,稍微有点差别,demo能成功运行,还未进行其他测试

主要参考的是golang自带库里的Buffer,结合了binary

来看看demo:

 1 package main
 2 
 3 import (
 4 "tbs"
 5 "fmt"
 6 )
 7 
 8 func main() {
 9 var ba *tbs.ByteArray = tbs.CreateByteArray([]byte{})
10 
11 ba.WriteBytes([]byte("abc"))
12 ba.WriteByte('A')
13 ba.WriteBool(true)
14 ba.WriteBool(false)
15 ba.WriteInt8(11)
16 ba.WriteInt16(123)
17 ba.WriteInt32(123)
18 ba.WriteInt64(513)
19 ba.WriteFloat32(123.456)
20 ba.WriteFloat64(456.789)
21 ba.WriteString("hello ")
22 ba.WriteUTF("world!")
23 
24 bytes := make([]byte, 3)
25 fmt.Println(ba.ReadBytes(bytes, 3, 0))
26  fmt.Println(ba.ReadByte())
27  fmt.Println(ba.ReadBool())
28  fmt.Println(ba.ReadBool())
29  fmt.Println(ba.ReadInt8())
30  fmt.Println(ba.ReadInt16())
31  fmt.Println(ba.ReadInt32())
32  fmt.Println(ba.ReadInt64())
33  fmt.Println(ba.ReadFloat32())
34  fmt.Println(ba.ReadFloat64())
35 fmt.Println(ba.ReadString(6))
36  fmt.Println(ba.ReadUTF())
37 
38 byte,err := ba.ReadByte()
39 if err == nil{
40 fmt.Println(byte)
41 }else{
42 fmt.Println("end of file")
43  }
44 
45 ba.Seek(3) //back to 3
46  fmt.Println(ba.ReadByte())
47 ba.Seek(39) //back to 39
48 fmt.Printf("ba has %d bytes available!\n", ba.Available())
49  fmt.Println(ba.ReadUTF())
50 }

demo中测试所有的方法

付上代码:

 1 package tbs
 2 
 3 import (
 4 "encoding/binary"
 5 "io"
 6 )
 7 
 8 type ByteArray struct {
 9 buf []byte
 10 posWrite int
 11 posRead int
 12  endian binary.ByteOrder
 13 }
 14 
 15 var ByteArrayEndian binary.ByteOrder = binary.BigEndian
 16 
 17 func CreateByteArray(bytes []byte) *ByteArray {
 18 var ba *ByteArray
 19 if len(bytes) > 0 {
 20 ba = &ByteArray{buf: bytes}
 21 } else {
 22 ba = &ByteArray{}
 23  }
 24 
 25 ba.endian = binary.BigEndian
 26 
 27 return ba
 28 }
 29 
 30 func (this *ByteArray) Length() int {
 31 return len(this.buf)
 32 }
 33 
 34 func (this *ByteArray) Available() int {
 35 return this.Length() - this.posRead
 36 }
 37 
 38 func (this *ByteArray) SetEndian(endian binary.ByteOrder) {
 39 this.endian = endian
 40 }
 41 
 42 func (this *ByteArray) GetEndian() binary.ByteOrder {
 43 if this.endian == nil {
 44 return ByteArrayEndian
 45  }
 46 return this.endian
 47 }
 48 
 49 func (this *ByteArray) grow(l int) {
 50 if l == 0 {
 51 return
 52  }
 53 space := len(this.buf) - this.posWrite
 54 if space >= l {
 55 return
 56  }
 57 
 58 needGrow := l - space
 59 bufGrow := make([]byte, needGrow)
 60 
 61 this.buf = Merge(this.buf, bufGrow)
 62 }
 63 
 64 func (this *ByteArray) SetWritePos(pos int) error{
 65 if pos > this.Length(){
 66 this.posWrite = this.Length()
 67 return io.EOF
 68 }else{
 69 this.posWrite = pos
 70  }
 71 return nil
 72 }
 73 
 74 func (this *ByteArray) SetWriteEnd(){
 75 this.SetWritePos(this.Length())
 76 }
 77 
 78 func (this *ByteArray) GetWritePos() int{
 79 return this.posWrite
 80 }
 81 
 82 func (this *ByteArray) SetReadPos(pos int) error{
 83 if pos > this.Length(){
 84 this.posRead = this.Length()
 85 return io.EOF
 86 }else{
 87 this.posRead = pos
 88  }
 89 return nil
 90 }
 91 
 92 func (this *ByteArray) SetReadEnd(){
 93 this.SetReadPos(this.Length())
 94 }
 95 
 96 func (this *ByteArray) GetReadPos() int{
 97 return this.posRead
 98 }
 99 
100 func (this *ByteArray) Seek(pos int) error{
101 err := this.SetWritePos(pos)
102 this.SetReadPos(pos)
103 
104 return err
105 }
106 
107 func (this *ByteArray) Reset() {
108 this.buf = []byte{}
109 this.Seek(0)
110 }
111 
112 func (this *ByteArray) Bytes() []byte {
113 return this.buf
114 }
115 
116 func (this *ByteArray) BytesAvailable() []byte {
117 return this.buf[this.posRead:]
118 }
119 //==========write
120 func (this *ByteArray) Write(bytes []byte) (l int, err error) {
121 this.grow(len(bytes))
122 
123 l = copy(this.buf[this.posWrite:], bytes)
124 this.posWrite += l
125 
126 return l, nil
127 }
128 
129 func (this *ByteArray) WriteBytes(bytes []byte) (l int, err error) {
130 return this.Write(bytes)
131 }
132 
133 func (this *ByteArray) WriteByte(b byte) {
134 bytes := make([]byte, 1)
135 bytes[0] = b
136 this.WriteBytes(bytes)
137 }
138 
139 func (this *ByteArray) WriteInt8(value int8) {
140 binary.Write(this, this.endian, &value)
141 }
142 
143 func (this *ByteArray) WriteInt16(value int16){
144 binary.Write(this, this.endian, &value)
145 }
146 
147 func (this *ByteArray) WriteInt32(value int32){
148 binary.Write(this, this.endian, &value)
149 }
150 
151 func (this *ByteArray) WriteInt64(value int64){
152 binary.Write(this, this.endian, &value)
153 }
154 
155 func (this *ByteArray) WriteFloat32(value float32){
156 binary.Write(this, this.endian, &value)
157 }
158 
159 func (this *ByteArray) WriteFloat64(value float64){
160 binary.Write(this, this.endian, &value)
161 }
162 
163 func (this *ByteArray) WriteBool(value bool){
164 var bb byte
165 if value {
166 bb = 1
167 } else {
168 bb = 0
169  }
170 
171 this.WriteByte(bb)
172 }
173 
174 func (this *ByteArray) WriteString(value string){
175 this.WriteBytes([]byte(value))
176 }
177 
178 func (this *ByteArray) WriteUTF(value string){
179 this.WriteInt16(int16(len(value)))
180 this.WriteBytes([]byte(value))
181 }
182 //==========read
183 
184 func (this *ByteArray) Read(bytes []byte) (l int, err error){
185 if len(bytes) == 0 {
186 return
187  }
188 if len(bytes) > this.Length() - this.posRead{
189 return 0, io.EOF
190  }
191 l = copy(bytes, this.buf[this.posRead:])
192 this.posRead += l
193 
194 return l, nil
195 }
196 
197 func (this *ByteArray) ReadBytes(bytes []byte, length int, offset int) (l int, err error){
198 return this.Read(bytes[offset:offset + length])
199 }
200 
201 func (this *ByteArray) ReadByte() (b byte, err error){
202 bytes := make([]byte, 1)
203 _, err = this.ReadBytes(bytes, 1, 0)
204 
205 if err == nil{
206 b = bytes[0]
207  }
208 
209 return
210 }
211 
212 func (this *ByteArray) ReadInt8() (ret int8, err error){
213 err = binary.Read(this, this.endian, &ret)
214 return
215 }
216 
217 func (this *ByteArray) ReadInt16() (ret int16, err error){
218 err = binary.Read(this, this.endian, &ret)
219 return
220 }
221 
222 func (this *ByteArray) ReadInt32() (ret int32, err error){
223 err = binary.Read(this, this.endian, &ret)
224 return
225 }
226 
227 func (this *ByteArray) ReadInt64() (ret int64, err error){
228 err = binary.Read(this, this.endian, &ret)
229 return
230 }
231 
232 func (this *ByteArray) ReadFloat32() (ret float32, err error){
233 err = binary.Read(this, this.endian, &ret)
234 return
235 }
236 
237 func (this *ByteArray) ReadFloat64() (ret float64, err error){
238 err = binary.Read(this, this.endian, &ret)
239 return
240 }
241 
242 func (this *ByteArray) ReadBool() (ret bool, err error){
243 var bb byte
244 bb, err = this.ReadByte()
245 if err == nil{
246 if bb == 1 {
247 ret = true
248 } else {
249 ret = false
250  }
251 }else{
252 ret = false
253  }
254 return
255 }
256 
257 func (this *ByteArray) ReadString(length int) (ret string, err error){
258 bytes := make([]byte, length)
259 _, err = this.ReadBytes(bytes, length, 0)
260 if err == nil{
261 ret = string(bytes)
262 }else{
263 ret = "";
264  }
265 return
266 }
267 
268 func (this *ByteArray) ReadUTF() (ret string, err error){
269 var l int16
270 l, err = this.ReadInt16()
271 
272 if err != nil{
273 return "", err
274  }
275 
276 return this.ReadString(int(l))
277 }

我用两个游标来控制,你可能会不习惯,但用起来会更加灵活!

我现在已经把ByteArray放在我的项目中了,已经完全整合进去了。

(如果要用这个类,那你可以做任意修改)
贴上我自己的博客地址:http://blog.codeforever.net/


有疑问加站长微信联系(非本文作者)

本文来自:博客园

感谢作者:rockyf

查看原文:golang仿AS3写的ByteArray

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

关注微信
5916 次点击
暂无回复
添加一条新回复 (您需要 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传

用户登录

没有账号?注册
(追記) (追記ここまで)

今日阅读排行

    加载中
(追記) (追記ここまで)

一周阅读排行

    加载中

关注我

  • 扫码关注领全套学习资料 关注微信公众号
  • 加入 QQ 群:
    • 192706294(已满)
    • 731990104(已满)
    • 798786647(已满)
    • 729884609(已满)
    • 977810755(已满)
    • 815126783(已满)
    • 812540095(已满)
    • 1006366459(已满)
    • 692541889

  • 关注微信公众号
  • 加入微信群:liuxiaoyan-s,备注入群
  • 也欢迎加入知识星球 Go粉丝们(免费)

给该专栏投稿 写篇新文章

每篇文章有总共有 5 次投稿机会

收入到我管理的专栏 新建专栏