javaer to go之byte类型转换

简介: <div class="markdown_views"><p>在Socket的Server和Client通信的过程中,传输的都是字节。而我们需要展示和使用的是字符串、整形等。这个时候,我们需要对字节进行处理,把byte类型的数据转成我们需要的类型。</p><h2 id="1byte与16进制字符串">1、[]byte与16进制字符串</h2><ul><li>[]by

在Socket的Server和Client通信的过程中,传输的都是字节。而我们需要展示和使用的是字符串、整形等。这个时候,我们需要对字节进行处理,把byte类型的数据转成我们需要的类型。

1、[]byte与16进制字符串

  • []byte转16进制字符串
import (
    "bytes"
    "strconv"
)

//byte转16进制字符串
func ByteToHex(data []byte) string {
    buffer := new(bytes.Buffer)
    for _, b := range data {

        s := strconv.FormatInt(int64(b&0xff), 16)
        if len(s) == 1 {
            buffer.WriteString("0")
        }
        buffer.WriteString(s)
    }

    return buffer.String()
}

因为要做字符串的拼接,所以我们通过bytes工具声明一个buffer,把strconv.FormatInt格式化单个byte的字符串写入buffer流中。

  • 16进制字符串转[]byte
import (
    "strconv"
)

//16进制字符串转[]byte
func HexToBye(hex string) []byte {
    length := len(hex) / 2
    slice := make([]byte, length)
    rs := []rune(hex)

    for i := 0; i < length; i++ {
        s := string(rs[i*2 : i*2+2])
        value, _ := strconv.ParseInt(s, 16, 10)
        slice[i] = byte(value & 0xFF)
    }
    return slice
}

通过把字符快速地转成rune类型地方式形成数组,然后在循环里两位两位地再拼成字符串。
使用strconv.ParseInt把16进制的字符串转成10进制的整形。
最后再把整形转成byte放入切片中。

2、byte与unit8

很简单,golang中byte和unit8都是8位的,直接转换就可以。

  • byte转unit8
i := uint8(b)
  • unit8转byte转
var i uint8
i = 1

b := byte(i)

3、byte[]与unit

字节与16位、32位及64位无符号整形之前的转换可使用”encoding/binary”包下的BigEndian(高位编址)与LittleEndian(低位编址)来操作,他们都实现了ByteOrder接口。提供了8位以上的无符号整形与byte数组之前的转换接口。

type ByteOrder interface {
    Uint16([]byte) uint16
    Uint32([]byte) uint32
    Uint64([]byte) uint64
    PutUint16([]byte, uint16)
    PutUint32([]byte, uint32)
    PutUint64([]byte, uint64)
    String() string
}

如我们把一个byte数组转成16位的无符号整形:

runningNumber := binary.BigEndian.Uint16(data[34:36])

初学者注意:

在[]byte与uint转换的过程中,得确定[]byte的长度与类型的类型是否匹配。因为两者的转换是通过位移来实现的。

encoding/binary的部分源码:

func (bigEndian) Uint16(b []byte) uint16 { return uint16(b[1]) | uint16(b[0])<<8 }

func (bigEndian) PutUint16(b []byte, v uint16) {
    b[0] = byte(v >> 8)
    b[1] = byte(v)
}
目录
相关文章
|
11月前
|
Go
深入解密Go语言的byte和rune用法 文本处理从这里开始
深入解密Go语言的byte和rune用法 文本处理从这里开始
77 0
深入解密Go语言的byte和rune用法 文本处理从这里开始
|
Go
Go 接收未知大小文件并转为对应大小的byte字节流
Go 接收未知大小文件并转为对应大小的byte字节流
315 0
来Javaer,学学go吧(四)
在学go的过程中,也是一脸蒙蔽,语法和java有很大区别也很随意,直到学到goroutine,实现并发编程太方便简洁了,真香!
105 5
|
消息中间件 缓存 运维
|
架构师 Java 程序员
慢聊Go之Javaer转型|Go主题月
慢聊Go之Javaer转型|Go主题月
144 0
慢聊Go之Javaer转型|Go主题月
|
Go
如何在 Go 中将 []byte 转换为 io.Reader?
如何在 Go 中将 []byte 转换为 io.Reader?
412 0
如何在 Go 中将 []byte 转换为 io.Reader?
|
消息中间件 缓存 安全
来Javaer,学学go吧(三)
在学go的过程中,也是一脸蒙蔽,语法和java有很大区别也很随意,直到学到goroutine,实现并发编程太方便简洁了,真香!
86 0
|
Go
Go uint64转化成[]byte
binary.BigEndian.PutUint64(byte切片变量, uint64变量) 链接:https://blog.csdn.net/coledaddy/article/details/71195528 ...
1812 0
|
SQL Java 数据库连接
javaer to go之简单的ORM封装
身为一个做企业级开发的javaer,习惯使用hibernate、ibatis等ORM框架来操作数据库。虽然也发现golang也有ORM框架,像beego ORM等。 为了熟悉golang的一些特性,我还是觉得自己封装一个ORM。 <h1 id="1struct与interface
3495 0