arrays - golang : convert uint32 (or any built-in type) to []byte (to be written in a file)

标签 arrays go byte unsafe

我正在尝试使用 unsafe 库在 Go 中将 uint32 转换为字节数组(4 个字节):

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, unsafe.Sizeof(h))
copy(a, *(*[]byte)(unsafe.Pointer(&h)))

前两行是正确的,但随后在 copy 调用时出现运行时错误(unexpected fault address)。

下一步是调用 Write

_, err = fi.Write(a)

将 4 个字节写入文件。

我发现了具有类似主题的其他问题,但没有一个具有有效代码的问题。 我也知道 unsafe 是不安全的。

任何帮助将不胜感激。

最佳答案

避免使用 unsafe包。

使用 encoding/binaryuint32 转换为字节 slice 的包:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := make([]byte, 4)
binary.LittleEndian.PutUint32(a, h)
_, err = fi.Write(a)

这个单线做同样的事情,但有额外的运行时成本:

err := binary.Write(fi, binary.LittleEndian, (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h))

以下是如何使用 unsafe 进行转换包装:

h := (uint32)(((fh.year*100+fh.month)*100+fh.day)*100 + fh.h)
a := (*[4]byte)(unsafe.Pointer(&h))[:]
_, err = fi.Write(a)

表达式 (*[4]byte)(unsafe.Pointer(&h))uint32 指针转换为 [4]byte 指针。最后的 [:][4]byte 上创建一个 slice 。

问题中的代码将 uint32 解释为 slice header .结果 slice 无效并且 copy 错误。

关于arrays - golang : convert uint32 (or any built-in type) to []byte (to be written in a file),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29061764/

相关文章:

c++ - 从 int64 转换为字节数组

javascript - 如何根据 URL 的输出设置 JavaScript 数组?

javascript - 将对象传递给函数时检索索引

go - 如何在生成交互式程序后捕获/记录所有内容

arrays - GO - 数组复制是深拷贝还是浅拷贝?

go - 多个串行请求导致缓冲区为空

arrays - 从空数组创建类型化数组列

c# - 从用户输入的逗号分隔字符串中删除所有额外空格到数组中的最干净的方法是什么

go - 删除 for 中的 slice 元素

java - 如何在hadoop中有位串?