1 回答
TA贡献2011条经验 获得超2个赞
所以基本上给出了这些基本类型:
type xchr int8
type xint int
type xdob float64
type xflt float32
您想要复制以下struct类型值的字节(内存表示):
type VEH1 struct { // 52 bytes total
p xint // 4 bytes (READ BELOW)
lat_lon_ele [3]xdob // 24 bytes
psi_the_phi [3]xflt // 12 bytes
gear_flap_vect [3]xflt // 12 bytes
}
请注意,intGo中的长度取决于平台,它可能是 32 位或 64 位,具体取决于您编译到的目标架构。这将导致平台相关行为,所以让我们暂时将其修复int32为:
type xint int32
这就是上述字节大小的struct计算方式。如果需要int64,只需更改它并在大小计算中添加 4 个额外字节。
接下来,您需要元素类型为 的数组中的结果xchr。您需要一个足够大的数组,即“前缀”"VEH1"后跟上面的数据struct。所以它的大小必须4+sizeof(VEH1)是56。
在 Go 中将一种类型的字节复制到另一种类型的内存空间中,可以将其unsafe封装及其通用Pointer类型。任何指针都可以转换为unsafe.Pointer并且unsafe.Pointer可以转换为任何指针类型,因此这是不同指针类型之间的“网关”。
您可以获取 的struct值的地址VHE1,将其转换为Pointer,并将结果转换Pointer为指向目标数据类型的指针。取消引用指针,现在您已经拥有其他类型的值。
内置copy()函数只能与切片一起使用,因此首先您需要对数据数组进行切片以便能够将它们传递给copy().
你可以这样做:
avio := VEH1{0, [3]xdob{47.460058, -122.32104, 8000.000},
[3]xflt{110.5, 0.0, 0.0}, [3]xflt{1.0, 0.0, 0.0}}
fmt.Printf("%+v\n", avio)
pavio := unsafe.Pointer(&avio)
pavio_arr := *((*[52]xchr)(pavio))
data_send := [56]xchr{'V', 'E', 'H', '1'}
n := copy(data_send[4:], pavio_arr[:])
fmt.Printf("Copied %d bytes\n", n)
fmt.Printf("%+v\n", data_send)
输出,包装以适应屏幕:
{p:0 lat_lon_ele:[47.460058 -122.32104 8000] psi_the_phi:[110.5 0 0]
gear_flap_vect:[1 0 0]}
Copied 52 bytes
[86 69 72 49 0 0 0 0 0 0 0 0 -81 33 56 46 -29 -70 71 64 77 45 91 -21 -117
-108 94 -64 0 0 0 0 0 64 -65 64 0 0 -35 66 0 0 0 0 0 0 0 0 0 0 -128 63 0 0 0 0]
在Go Playground上尝试工作演示。
结果为 []byte
如果您想要[]byte结果(例如,您想将结果写入 an io.Writer),则使用[56]byte类型 fordata_send并且当然强制转换pavio为*[52]byte:
pavio := unsafe.Pointer(&avio)
pavio_arr := *((*[52]byte)(pavio))
data_send := [56]byte{'V', 'E', 'H', '1'}
n := copy(data_send[4:], pavio_arr[:])
- 1 回答
- 0 关注
- 289 浏览
添加回答
举报