分享
  1. 首页
  2. 文章

javaer to go之byte类型转换

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

在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)
}

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

本文来自:CSDN博客

感谢作者:p_3er

查看原文:javaer to go之byte类型转换

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

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

用户登录

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

今日阅读排行

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

一周阅读排行

    加载中

关注我

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

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

给该专栏投稿 写篇新文章

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

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