用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/
有疑问加站长微信联系(非本文作者)