栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

将[] byte转换为Little / Big-Endian Signed Integer或Float?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

将[] byte转换为Little / Big-Endian Signed Integer或Float?

将数字类型转换为一系列字节(

[]byte
),反之亦然,这与字节序有关。您如何解释结果完全取决于您。

您所需要做的就是汇编一个16位,32位或64位值,完成后,您可以根据需要解释结果。

例如,如果您已经有一个

uint16
值(将其用作带符号的值),那么您所需要做的就是类型转换,因为
uint16
and
的内存布局
int16
是相同的(从
uint16
to 转换
int16
不会只改变类型的内存表示形式):

a := binary.LittleEndian.Uint16(sampleA)// If you need int16:a2 := int16(a)

类似地:

a := binary.LittleEndian.Uint64(sampleA)// If you need int64:a2 := int64(a)

使用uint-> float转换的情况要复杂一些,因为使用简单的类型转换将尝试转换数值,而不仅仅是更改类型(因此将更改内存表示形式)。

用于将无符号整数,以浮动的类型,则可以使用的功能

math
包,即
math.Float32frombits()
math.Float64frombits()
,并且对于具有相同的内存布局的反方向(一个浮点值转换为无符号整数):
math.Float32bits()
math.Float64bits()

例如:

a := binary.LittleEndian.Uint64(sampleA)// If you need a float64:a2 := math.Float64frombits(a)

如果您从

math
软件包中研究这些功能的实现,则可以看到没有使用内存值/布局,而是通过使用
unsafe
软件包将其“查看”为不同的类型。例如:

func Float32frombits(b uint32) float32 { return *(*float32)(unsafe.Pointer(&b)) }

正如保罗所说,

binary
包提供
Read()
,并
Write()
因此你不需要的功能做的引擎盖下这些转换。

使用相同的“ pi”示例进行展示(来自的文档

binary.Read()
):

b := []byte{0x18, 0x2d, 0x44, 0x54, 0xfb, 0x21, 0x09, 0x40}// USING binary.Read()var pi float64buf := bytes.NewReader(b)err := binary.Read(buf, binary.LittleEndian, &pi)if err != nil {    fmt.Println("binary.Read failed:", err)}fmt.Println(pi)// Using LittleEndian.Uint64() and math.Float64frombits()a := binary.LittleEndian.Uint64(b)a2 := math.Float64frombits(a)fmt.Println(a2)

输出(在Go Playground上尝试):

3.1415926535897933.141592653589793


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/448194.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号