我在linux内核中编写自定义协议。我使用以下结构
struct syn {
__be32 id;
__be64 cookie;
};
struct ack {
__be32 id; // Right now, setting it to 14 (Just a random choice)
__be32 sequence;
};
struct hdr {
............
__be32 type; //last element
};
当我发送和接收数据包时,我将结构syn
和ack
(针对不同的数据包)映射到hdr->类型的地址。
理想情况下,这应该意味着id(在syn和ack结构中)应该映射到hdr->type
,而struct hdr
之后的任何内容应该映射到syn->cookie
或{{1取决于我映射到ack->sequence
。
但是在打印出这些变量的内存地址时,我得到以下内容
hdr->type
那么,当//For struct syn
hdr->type at ffff880059f55444
syn->id at ffff880059f55444
syn->cookie at ffff880059f5544c //See the last two bits
//For struct ack_frame
hdr->type at ffff880059f55044
ack->id at ffff880059f55044
ack->sequence at ffff880059f55048 //See the last two bits
和syn->cookie
具有相同的尺寸时,为什么ack->sequence
和hdr->type
会在相对于ack->id
的不同偏移处开始?
编辑1:我使用
映射这些结构syn->id
答案 0 :(得分:1)
因为你在64位工作,编译器填充结构如下:
import arcpy, os
from arcpy import env
from arcpy.sa import *
env.workspace = "C:/rasters/threshold"
outws = "C:/SIG/MelasCA_30runs_avg/threshold/mesoamerica"
mask = "C:/GIS/mesoamerica.shp"
rasterlist = arcpy.ListDatasets("*", "Raster")
for i in rasterlist:
outExtractByMask = ExtractByMask(i, mask)
outname = os.path.join(outws, str(i)) # Create the full out path
outExtractByMask.save(outname)
我猜数据没有漏洞,所以要修复它,你需要将seq设置为uint32_t并稍后再投射。
答案 1 :(得分:1)
https://gcc.gnu.org/onlinedocs/gcc/Common-Type-Attributes.html#Common-Type-Attributes
看看packed
。无论出于何种原因,GCC不允许我直接链接到该部分。
答案 2 :(得分:0)
您应该将结构定义如下。属性打包表示allignment应为1个字节。 以下结构将是12个字节长。如果你不使用" attribyte"关键字,你的结构长16个字节。
struct yours{
__be32 id;
__be64 cookie;
}__attribute__((__packed__));