c - 戈朗 : pack a struct

标签 c go struct pack

请考虑这个示例 go 代码:

package main

//#include <stdio.h>
//#include <stdint.h>
//#pragma pack(push, 1)
//struct Packed_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//#pragma pack(pop)
//
//struct UnPacked_Struct {
//  uint16_t A;
//  uint16_t B;
//  uint32_t C;
//  uint16_t D;
//};
//
//
//void print_C_struct_size(){
//  struct Packed_Struct Packed_Struct;
//  struct UnPacked_Struct UnPacked_Struct;
//  printf("Sizeof Packed_Struct: %lu\n", sizeof(Packed_Struct) );
//  printf("Sizeof UnPacked_Struct: %lu\n", sizeof(UnPacked_Struct) );
//  return;
//}
//
import "C"



import(
    "fmt"
    "unsafe"
)

type GoStruct struct{
    A   uint16
    B   uint16
    C   uint32
    D   uint16
}


func main(){
    fmt.Println("Hello world!")
    meh := C.print_C_struct_size()
    var GoStruct GoStruct
    fmt.Printf("Sizeof GoStruct : %d\n", unsafe.Sizeof(GoStruct) ) 
    fmt.Printf("meh type: %T\n", meh)
}

输出是:

$ go run cgo.go 
Hello world!
Sizeof Packed_Struct: 10
Sizeof UnPacked_Struct: 12
Sizeof GoStruct : 12
meh type: main._Ctype_void

请注意,打包后的结构占用 10 个字节,否则占用 12 个字节。默认情况下,我在 Go 中的尝试似乎占用 12 个字节,如此处所示。

是否有 Go-ish 方法来打包此结构,使其仅使用 10 个字节?

最佳答案

因此,根据 https://github.com/golang/go/wiki/cgo#struct-alignment-issues :

Go 不支持打包结构(例如,最大对齐为 1 字节的结构),您不能在 Go 中使用打包的 C 结构。即使你的程序通过了编译,它也不会如你所愿。要使用它,您必须将结构读/写为字节数组/slice

根据我所理解的“什么”,我整理了这个:https://play.golang.org/p/OmdMVDMikSn .

本质上,设置结构体,并将其binary.Write成一个字节 slice , slice 显示10个字节。

关于c - 戈朗 : pack a struct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55681650/

相关文章:

c - 双指针 C/C++

go - Channel 有一个奇怪的行为,为什么要阻止?

c - 使用 C 进行数字到字符串的映射

memory-management - Go怎么没有stackoverflow

struct - Swift 和变异结构

c - 在 C 中声明一个与数组一起使用的结构

c - 将 C 指针插入堆栈,获取表

c - getmaxyx() 代码:: block 中的错误

c - 如何获取C指针数组长度?

json - 当我尝试用 go lang 调用值时出错