在 Go 中编写打包二进制文件的惯用方法是什么,它会产生与此 Python 相同的输出?
What is the idiomatic way to write a packed binary file in Go that would produce the same output as this Python?
我正在尝试找出 如何 在 Go 中编写二进制文件的最佳方法,该文件对应于以下 Python:
import struct
f = open('tst.bin', 'wb')
fmt = 'iih'
f.write(struct.pack(fmt,4, 185765, 1020))
f.close()
我一直在修改我在 Github.com 和其他一些资源中看到的一些示例 ,但我似乎无法让任何东西正常工作 . 在 Go 中做这种事情的惯用方法是什么?
下面是我现在是如何完成的(Golang):
package main
import (
"fmt"
"os"
"encoding/binary"
)
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
aBuf := make([]byte, 4)
bBuf := make([]byte, 4)
cBuf := make([]byte, 2)
binary.LittleEndian.PutUint32(aBuf, 4)
binary.LittleEndian.PutUint32(bBuf, 185765)
binary.LittleEndian.PutUint16(cBuf, 1020)
binary.Write(fp, binary.LittleEndian, aBuf)
binary.Write(fp, binary.LittleEndian, bBuf)
binary.Write(fp, binary.LittleEndian, cBuf)
}
已验证Python:
import numpy as np
data = np.fromfile('tst.bin', dtype='i4,i4,i2')
print(data)
正如我在问题中提到的,我不确定这是执行此操作的惯用方法,但经过相当多的修改后,这确实解决了我遇到的问题。发布这样至少有一个答案以防其他人来看:
package main
import (
"fmt"
"os"
"encoding/binary"
)
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
aBuf := make([]byte, 4)
bBuf := make([]byte, 4)
cBuf := make([]byte, 2)
binary.LittleEndian.PutUint32(aBuf, 4)
binary.LittleEndian.PutUint32(bBuf, 185765)
binary.LittleEndian.PutUint16(cBuf, 1020)
binary.Write(fp, binary.LittleEndian, aBuf)
binary.Write(fp, binary.LittleEndian, bBuf)
binary.Write(fp, binary.LittleEndian, cBuf)
}
稍微清理一下,让它更简短我会做这样的事情:
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
lineBuf := make([]byte, 10) //sized large enough to hold my two 4 byte ints and one 2 byte int
binary.LittleEndian.PutUint32(lineBuf[0:4], 4) //packing into 4 bytes
binary.LittleEndian.PutUint32(lineBuf[4:8], 185765)
binary.LittleEndian.PutUint16(lineBuf[8:10], 1020) //packing into 2 bytes
binary.Write(fp, binary.LittleEndian, lineBuf)
}
经过更多的修改和对另一个问题的一些反馈后,我能够想出这个(看起来更清晰但会 post 在测试生成一些大文件后对性能的反馈):
package main
import (
"os"
"encoding/binary"
)
type binData struct {
A int32
B int32
C int16
}
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
bd := binData{A:4, B:185765, C:1020}
binary.Write(fp, binary.LittleEndian, &bd)
}
我正在尝试找出 如何 在 Go 中编写二进制文件的最佳方法,该文件对应于以下 Python:
import struct
f = open('tst.bin', 'wb')
fmt = 'iih'
f.write(struct.pack(fmt,4, 185765, 1020))
f.close()
我一直在修改我在 Github.com 和其他一些资源中看到的一些示例 ,但我似乎无法让任何东西正常工作 . 在 Go 中做这种事情的惯用方法是什么?
下面是我现在是如何完成的(Golang):
package main
import (
"fmt"
"os"
"encoding/binary"
)
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
aBuf := make([]byte, 4)
bBuf := make([]byte, 4)
cBuf := make([]byte, 2)
binary.LittleEndian.PutUint32(aBuf, 4)
binary.LittleEndian.PutUint32(bBuf, 185765)
binary.LittleEndian.PutUint16(cBuf, 1020)
binary.Write(fp, binary.LittleEndian, aBuf)
binary.Write(fp, binary.LittleEndian, bBuf)
binary.Write(fp, binary.LittleEndian, cBuf)
}
已验证Python:
import numpy as np
data = np.fromfile('tst.bin', dtype='i4,i4,i2')
print(data)
正如我在问题中提到的,我不确定这是执行此操作的惯用方法,但经过相当多的修改后,这确实解决了我遇到的问题。发布这样至少有一个答案以防其他人来看:
package main
import (
"fmt"
"os"
"encoding/binary"
)
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
aBuf := make([]byte, 4)
bBuf := make([]byte, 4)
cBuf := make([]byte, 2)
binary.LittleEndian.PutUint32(aBuf, 4)
binary.LittleEndian.PutUint32(bBuf, 185765)
binary.LittleEndian.PutUint16(cBuf, 1020)
binary.Write(fp, binary.LittleEndian, aBuf)
binary.Write(fp, binary.LittleEndian, bBuf)
binary.Write(fp, binary.LittleEndian, cBuf)
}
稍微清理一下,让它更简短我会做这样的事情:
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
lineBuf := make([]byte, 10) //sized large enough to hold my two 4 byte ints and one 2 byte int
binary.LittleEndian.PutUint32(lineBuf[0:4], 4) //packing into 4 bytes
binary.LittleEndian.PutUint32(lineBuf[4:8], 185765)
binary.LittleEndian.PutUint16(lineBuf[8:10], 1020) //packing into 2 bytes
binary.Write(fp, binary.LittleEndian, lineBuf)
}
经过更多的修改和对另一个问题的一些反馈后,我能够想出这个(看起来更清晰但会 post 在测试生成一些大文件后对性能的反馈):
package main
import (
"os"
"encoding/binary"
)
type binData struct {
A int32
B int32
C int16
}
func main() {
fp, err := os.Create("tst.bin")
if err != nil {
panic(err)
}
defer fp.Close()
bd := binData{A:4, B:185765, C:1020}
binary.Write(fp, binary.LittleEndian, &bd)
}