zoukankan      html  css  js  c++  java
  • golang仿AS3写的ByteArray

    用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/

  • 相关阅读:
    winform 与 html 交互 简单案例
    Winform窗口弹出位置控制
    c#预处理指令
    最简单的数据绑定
    Asp.Net细节性问题精萃
    AjaxUploader使用
    Log4net对文件的支持
    Log4net对数据库的支持
    Log4net使用
    Log4net介绍
  • 原文地址:https://www.cnblogs.com/rockyf/p/golang_bytearray.html
Copyright © 2011-2022 走看看