问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

golang 结构体 字节对齐是怎么样的

发布网友 发布时间:2022-04-20 08:21

我来回答

1个回答

热心网友 时间:2022-04-10 04:59

用golang解析二进制协议时,其实没必要管结构体的字段的对齐规则,何况语言规范也没有规定如何对齐,也就是没有规则。用encoding/binary.Read函数直接读入struct里就行,struct就像c那样写
type Data struct {
Size, MsgType uint16
Sequence uint32
// ...
}
golang编译器加不加padding,Read都能正常工作,runtime知道Data的布局的,不像C直接做cast所以要知道怎样对齐。
用unsafe.Alignof可以知道每个field的对齐长度,但没必要用到。

package main

/*
#include <stdint.h>

#pragma pack(push, 1)
typedef struct {
uint16_t size;
uint16_t msgtype;
uint32_t sequnce;
uint8_t data1;
uint32_t data2;
uint16_t data3;
} mydata;
#pragma pack(pop)

mydata foo = {
1, 2, 3, 4, 5, 6,
};

int size() {
return sizeof(mydata);
}
*/
import "C"
import (
"bytes"
"encoding/binary"
"fmt"
"log"
"unsafe"
)

func main() {
bs := C.GoBytes(unsafe.Pointer(&C.foo), C.size())
fmt.Printf("len %d data %v\n", len(bs), bs)
var data struct {
Size, Msytype uint16
Sequence uint32
Data1 uint8
Data2 uint32
Data3 uint16
}
err := binary.Read(bytes.NewReader(bs), binary.LittleEndian, &data)
if err != nil {
log.Fatal(err)
}
fmt.Printf("%v\n", data) // {1 2 3 4 5 6}

buf := new(bytes.Buffer)
binary.Write(buf, binary.BigEndian, data)
fmt.Printf("%d %v\n", buf.Len(), buf.Bytes()) // 15 [0 1 0 2 0 0 0 3 4 0 0 0 5 0 6]
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
什么叫做项目融资贷款 小区物业要买公众责任险,要向物业公司打报告,报告范文怎么写_百度知 ... ...证被亲戚拿去做银行抵押贷款了,当初我签字担保人,现在怎么处理_百度... ...现在他一直没还款银行要起诉他了,他有房产证等他能用房子抵压吗... 破坏小区围墙进入小区偷盗公众责任险要赔付吗 2023-08-05 如何基于 uni-push2.0 实现全平台推送 ...叫我拿房产证复印件去银行帮他做担保人,然后还说每个月给我二干四... 洗脸扑会过期吗 2023-08-15 如何在 uni-app 中检测 APP 端是否有通知权限 减肥期间怎么饮食饿了怎么办 golang 方法返回的结构体为什么取不到地址? golang 结构体与error 的问题? GoLang结构体帮忙可以理解是PHP中的数组吗 在Go 语言中,为什么结构体类型可以同时使用指针传... golang函数返回值是结构体值的时候,为何不能对成... golang怎么返回结构体 golang 中结构体与字节数组能相互转化么 go语言中怎么给结构体分配内存 go语言结构体变量和结构体指针变量的区别 go语言怎么判断一个结构体里有几个字段 怎么把MP4转换成ts格式 windows下怎样生成ts和m3u8文件 有什么手机播放器能支持TP跟TS视频格式的? 我用ffmpeg.exe 把视频转换为mpeg2格式,不知道怎... M3U8文件打不开,下载的ts文件也打不开,potplayer... TS格式的视频文件怎么转换成mp4文件。 下载的视频为若干.ts文件,一个m3u8文件,和一个ke... ffmpeg怎么把编码好的h264帧存入ts文件里 如何使用ffmpeg将h264标准码流生成m3u8索引和ts段文件 向bat拖拽进文件夹利用ffmpeg把视频向指定路径切片... golang struct结构体字段类型有哪些 被盗了怎么办怎么找回来? 被盗了,可以找回来嘛 被盗了,也被改了,怎么办? 被盗了,还被对方改了电话号码怎么办? 被盗用了该怎么办 被盗了还改了密码怎么办? 被盗了手机号和密码都被改了怎么办? 被盗了登不上去怎么办怎么找回来? 被盗的怎么找回来 被盗后怎么办 被盗后怎么办 被盗了,没办法找回,怎么办 被盗了怎么办? 被盗了,实名认证被改了。手机号也被改了。... 被盗可以找回来吗? 我的被盗,怎么查出盗号人 我的被盗用了怎么能找回来? 怎样追回被盗的? 被盗,如何找回?