go语言结构体转byte go结构体转换成c结构体

golang 中结构体与字节数组能相互转化么

结构体与[]byte不能直接转化,可以通过gob来转换。

港南ssl适用于网站、小程序/APP、API接口等需要进行数据传输应用场景,ssl证书未来市场广阔!成为创新互联的ssl证书销售渠道,可以享受市场价格4-6折优惠!如果有意向欢迎电话联系或者加微信:18982081108(备注:SSL证书合作)期待与您的合作!

编码时如下,假设默认的结构体为data

func Encode(data interface{}) ([]byte, error) { buf := bytes.NewBuffer(nil) enc := gob.NewEncoder(buf) err := enc.Encode(data) if err != nil { return nil, err } return buf.Bytes(), nil }解码时如下,data为需要解码的字节数组,to为相应的接收结构体,记住to的结构体结构应与被编码的data相一致,解码后内容保存在to里面,直接使用to即可

func Decode(data []byte, to interface{}) error { buf := bytes.NewBuffer(data) dec := gob.NewDecoder(buf) return dec.Decode(to) }使用的时候:

b, err := Encode(data) if err != nil { //错误处理 } if err := Decode(b, to); err != nil { //错误处理}

Go语言中的字节序

Go中的binary包实现了简单的数字与字节序列的转换以及变长值的编解码

package main

import ( "fmt" "bytes" "encoding/binary" ) func main(){ n := 0x12345678 bytesBuffer := bytes.NewBuffer([]byte{}) //BigEndian 大端顺序存储 LittleEndian小端顺序存储 binary.Write(bytesBuffer, binary.BigEndian, int32(n)) data:=bytesBuffer.Bytes() fmt.Printf("[0]: %#x addr:%#x\n",data[0],data[0]) fmt.Printf("[0]: %#x addr:%#x\n",data[1],data[1]) fmt.Printf("[0]: %#x addr:%#x\n",data[2],data[2]) fmt.Printf("[0]: %#x addr:%#x\n",data[3],data[3]) }

输出

[0]: 0x12 addr:0xc042010248 [1]: 0x34 addr:0xc042010249 [2]: 0x56 addr:0xc04201024a [3]: 0x78 addr:0xc04201024b

也可以使用下面的方式

n := 0x12345678 var data []byte = make([]byte,4) //操作的都是无符号整型 binary.BigEndian.PutUint32(data,uint32(n))

可以使用下面的方式判断当前系统的字节序类型

const INT_SIZE int = int(unsafe.Sizeof(0))

//判断我们系统中的字节序类型 func systemEdian() { var i int = 0x1 bs := (*[INT_SIZE]byte)(unsafe.Pointer(i)) if bs[0] == 0 { fmt.Println("system edian is little endian") } else { fmt.Println("system edian is big endian") } }

怎样将此结构体转化为byte数组

你没有给出具体的结构。现在 假定 一个结构,你可以依葫芦画瓢得到 byte数组。

byte数组 就是 unsigned char 数组。可用动态内存分配数组,满足 你的结构大小。

结构大小 可以用 sizeof( 数组类型)算得。 然后用 memcpy 把结构内容 复制给 byte数组。

c 语言 程序例子如下:

#include stdio.h

struct SS { char c[10]; float f; double d; }; //结构定义

int main(){

unsigned char *b; // byte 指针

int N,i;

struct SS s={"abc123",4.56,7.89}; //声明一个结构对象并初始化

N = sizeof(struct SS); //结构大小

b = (unsigned char *) malloc(N); //动态分配

memcpy(b, s, sizeof(struct SS)); //内容复制

for (i=0;iN;i++) printf("%02x ",b[i]); // 输出复制来的内容 供验证

return 0;

}

这个例子输出:

61 62 63 31 32 33 00 00 00 00 00 00 85 eb 91 40 8f c2 f5 28 5c 8f 1f 40


本文标题:go语言结构体转byte go结构体转换成c结构体
当前路径:http://ybzwz.com/article/ddccjch.html