我正在尝试在 Go 中读取二进制文件。
基本上我有一个这样的结构:
type foo struct {
A int16
B int32
C [32]byte
// and so on...
}
我正在从文件中读取到结构中,如下所示:
fi, err := os.Open(fname)
// error checking, defer close, etc.
var bar foo
binary.Read(fi, binary.LittleEndian, &bar)
现在,这应该可行,但我得到了一些奇怪的结果。例如,当我读入结构时,我应该得到这个:
A: 7
B: 8105
C: // some string
但我得到的是:
A: 7
B: 531169280
C: // some correct string
这样做的原因是因为在binary.Read()读取文件时,在读取[]byte{7, 0}as int16(7)( 的正确值A)后,它遇到切片[]byte{0, 0, 169, 31}并尝试将其转换为int32. 但是,binary.Read()的转换是这样做的:
uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24b字节切片在哪里。
但真正让我困惑的是在 C 中做完全相同的事情工作得很好。
如果我用 C 写这个:
int main()
{
int fd;
struct cool_struct {
short int A;
int32_t B;
char C[32];
// you get the picture...
} foo;
int sz = sizeof(struct cool_struct);
const char* file_name = "/path/to/my/file"
fd = open(file_name, O_RDONLY);
// more code
read(fd, &foo, sz);
// print values
}
我得到了正确的结果。为什么我的 C 代码正确而我的 Go 代码不是?
慕森王
慕桂英4014372
相关分类