import (
    "bytes"
    "encoding/binary"
)

const (
    // 支持数据最大长度为 2 << 61
    // DataLengthOfLenth = 8
    // 支持数据最大长度为 2 << 30
    DataLengthOfLenth = 4
)

//通讯协议处理,主要处理封包和解包的过程
type Protocol struct {
    // 包头
    header string
    // 包头长度
    headerLen int
}

func NewProtocol(packetHeader string) *Protocol {
    return &Protocol{
        header:    packetHeader,
        headerLen: len([]byte(packetHeader)),
    }
}

func (self *Protocol) ReSet(header string) {
    self.header = header
    self.headerLen = len([]byte(header))
}

//封包
func (self *Protocol) Packet(message []byte) []byte {
    return append(append([]byte(self.header), IntToBytes(len(message))...), message...)
}

//解包
func (self *Protocol) Unpack(buffer []byte) (readerSlice [][]byte, bufferOver []byte) {
    length := len(buffer)

    var i int
    for i = 0; i < length; i = i + 1 {
        if length < i+self.headerLen+DataLengthOfLenth {
            break
        }
        if string(buffer[i:i+self.headerLen]) == self.header {
            messageLength := BytesToInt(buffer[i+self.headerLen : i+self.headerLen+DataLengthOfLenth])
            if length < i+self.headerLen+DataLengthOfLenth+messageLength {
                break
            }
            data := buffer[i+self.headerLen+DataLengthOfLenth : i+self.headerLen+DataLengthOfLenth+messageLength]

            readerSlice = append(readerSlice, data)

            i += self.headerLen + DataLengthOfLenth + messageLength - 1
        }
    }

    if i == length {
        bufferOver = make([]byte, 0)
        return
    }
    bufferOver = buffer[i:]
    return
}

//整形转换成字节
// func IntToBytes(n int) []byte {
//     x := int64(n)

//     bytesBuffer := bytes.NewBuffer([]byte{})
//     binary.Write(bytesBuffer, binary.BigEndian, x)
//     return bytesBuffer.Bytes()
// }

// //字节转换成整形
// func BytesToInt(b []byte) int {
//     bytesBuffer := bytes.NewBuffer(b)

//     var x int64
//     binary.Read(bytesBuffer, binary.BigEndian, &x)

//     return int(x)
// }

//整形转换成字节
func IntToBytes(n int) []byte {
    x := int32(n)

    bytesBuffer := bytes.NewBuffer([]byte{})
    binary.Write(bytesBuffer, binary.LittleEndian, x)
    return bytesBuffer.Bytes()
}

//字节转换成整形
func BytesToInt(b []byte) int {
    bytesBuffer := bytes.NewBuffer(b)

    var x int32
    binary.Read(bytesBuffer, binary.LittleEndian, &x)

    return int(x)
}

procotol.go 源码阅读的更多相关文章

  1. 【原】FMDB源码阅读(三)

    [原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ...

  2. 【原】FMDB源码阅读(二)

    [原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ...

  3. 【原】FMDB源码阅读(一)

    [原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ...

  4. 【原】AFNetworking源码阅读(六)

    [原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ...

  5. 【原】AFNetworking源码阅读(五)

    [原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ...

  6. 【原】AFNetworking源码阅读(四)

    [原]AFNetworking源码阅读(四) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇还遗留了很多问题,包括AFURLSessionManagerTaskDe ...

  7. 【原】AFNetworking源码阅读(三)

    [原]AFNetworking源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇的话,主要是讲了如何通过构建一个request来生成一个data tas ...

  8. 【原】AFNetworking源码阅读(二)

    [原]AFNetworking源码阅读(二) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中我们在iOS Example代码中提到了AFHTTPSessionMa ...

  9. 【原】AFNetworking源码阅读(一)

    [原]AFNetworking源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 AFNetworking版本:3.0.4 由于我平常并没有经常使用AFNetw ...

随机推荐

  1. coco2dx添加类报错

    最近刚开始学习2dx,用的vs编辑器,现在说说我使用时碰到的一点小问题: 我使用的类添加向导,但是添加的类在win32目录下,而且编译的时候总是提示找不到 .h 文件 其实,这样添加类不是很好,可以在 ...

  2. Django signals机制的几个简单问题

    1.Django signals机制不是异步执行,是同步执行,所以需要异步执行的耗时任务不能用这个. 2.异步耗时任务不用这个,那些用signals?主要是解耦那些多次重复场合被调用的函数.直接用事件 ...

  3. TabLayout:另一种Tab的实现方式

    http://blog.csdn.NET/aigestudio/article/details/47155769 在5.0以前我们想要实现像网易新闻客户端那样的的Tab可以有很多种选择: 比如古老的T ...

  4. RPi:QT+wiringPi demo程序

    一个项目里面要用到这玩意儿,网上查了几篇文章凑出来最后还是不行,自己灵机一动就成了. 今天再次搜索的时候,发现另一篇文章已经讲明白了,真是欲哭无泪 程序大部分参考的是之前学qt的摸索出来的,其实只要在 ...

  5. RDC去省赛玩前の日常训练 Chapter 2

    2018.4.9 施展FFT ing! 马上就要和前几天学的斯特林数双剑合璧了!

  6. MQTT入手笔记

    MQTT服务官网:http://mosquitto.org/download/ 在unix系统按照以下步骤运行并启动mqtt服务: 1. # 下载源代码包wget http://mosquitto.o ...

  7. Windows下Markdown软件的选择

    从开始Java学习这个系列的同时,我也开始改用Markdown而不是无比蛋疼的博客园默认编辑器来进行博客管理.但是Windows下想找一个比较好的Markdown编辑器蛮困难的,可以说专门的Markd ...

  8. 利用VMWare 11 在 Windows 8.1 下安装与优化 OS X 10.10

    此文中相关工具点击我从百度网盘下载 一.安装 第一步安装参考百度经验:点击这里,鉴于其中提供的文件全部不能用,替换成了上面的,亲测Intel Core I5 4200M 可用. 二.优化 这里给出一些 ...

  9. 16.git命令汇总

  10. python3 爬取qq音乐作者所有单曲 并且下载歌曲

    1 import requests import re import json import os # 便于存放作者的姓名 zuozhe = [] headers = {'User-Agent': ' ...