C-字节数组到结构(dns查询)
我有以下结构:C-字节数组到结构(dns查询),c,dns,bytearray,structure,C,Dns,Bytearray,Structure,我有以下结构: typedef struct dnsQuery { char header[12]; struct TdnsQuerySection *querySection; } TdnsQuery; typedef struct dnsQuerySection { unsigned char *name; struct TdnsQueryQuestion *question; } TdnsQuerySection; typedef struct dnsQueryQues
typedef struct dnsQuery {
char header[12];
struct TdnsQuerySection *querySection;
} TdnsQuery;
typedef struct dnsQuerySection {
unsigned char *name;
struct TdnsQueryQuestion *question;
} TdnsQuerySection;
typedef struct dnsQueryQuestion {
unsigned short qtype;
unsigned short qclass;
} TdnsQueryQuestion;
我在字节数组中从recvfrom
进行dns查询。
我试图从字节数组中获得如下结构:
TdnsQuery* dnsQuery = (TdnsQuery*)buf;
printf("%u", dnsQuery->querySection->question.qtype);
为什么取消引用指向不完整类型的指针时出错?我这样做对吗?或者如何从该数组中获取dns查询结构?我需要dns查询问题和类型。您的查询部分打印机类型不完整。您需要预先对其进行typedef,并且不使用structure关键字,或者使用结构名称而不是typedef。e、 g:
typedef struct foo Foo;
struct {
Foo* querySection;
// effectively same as above
struct foo* querySection2;
// NOT the following.
struct Foo* querySectionWrong;
};
您的查询部分打印机类型不完整。您需要预先对其进行typedef,并且不使用structure关键字,或者使用结构名称而不是typedef。e、 g:
typedef struct foo Foo;
struct {
Foo* querySection;
// effectively same as above
struct foo* querySection2;
// NOT the following.
struct Foo* querySectionWrong;
};
谢谢,这很有帮助,你能再帮我一次吗?现在,当我尝试打印时,我得到了seg故障11。问题出在哪里?我认为您的结构没有正确映射到您正在转换的数据上。如果取消引用的指针无效(可能为null或类似),则看起来像一个。在取消引用之前,请尝试打印每个指针,或使用调试器检查它们的值。此外,您可能还记得
foo*bar
和foo bar[]
不是一回事。第一个是指向某个内存的指针,第二个是一块内存,其中包含多个相邻的foo
类型。谢谢,我知道其中的区别。我尝试过并且dnsQuery->querySection
不为空,但是当我尝试访问querySection中的变量时,我得到了seg错误。querySection中的unsigned char*name
可能存在一些问题,但如何解决?它有变量lenght。指针不等于NULL并不意味着指针是有效的。NULL只是保证无效。如果您是从文件、缓冲区或其他地方获取数据,那么您需要编写一个结构来模拟缓冲区中的数据表示。例如,由十个字符组成的列表后跟一些结构的列表可能是struct bar{char name[10];struct baz[];}
。在不了解基础数据的情况下,我真的帮不了你。谢谢,这很有帮助,你能帮我一次吗?现在,当我尝试打印时,我得到了seg故障11。问题出在哪里?我认为您的结构没有正确映射到您正在转换的数据上。如果取消引用的指针无效(可能为null或类似),则看起来像一个。在取消引用之前,请尝试打印每个指针,或使用调试器检查它们的值。此外,您可能还记得foo*bar
和foo bar[]
不是一回事。第一个是指向某个内存的指针,第二个是一块内存,其中包含多个相邻的foo
类型。谢谢,我知道其中的区别。我尝试过并且dnsQuery->querySection
不为空,但是当我尝试访问querySection中的变量时,我得到了seg错误。querySection中的unsigned char*name
可能存在一些问题,但如何解决?它有变量lenght。指针不等于NULL并不意味着指针是有效的。NULL只是保证无效。如果您是从文件、缓冲区或其他地方获取数据,那么您需要编写一个结构来模拟缓冲区中的数据表示。例如,由十个字符组成的列表后跟一些结构的列表可能是struct bar{char name[10];struct baz[];}
。在不了解底层数据的情况下,我无法真正提供帮助。通过recvfrom
接收的dns查询不包含指针值,因此您无法将其直接映射到问题中显示的结构。您需要修改结构定义,使其不包含指针,或者需要解析接收到的数据,并逐个字段填充结构。通过recvfrom
接收的dns查询不包含指针值,因此无法将其直接映射到问题中显示的结构。您需要修改结构定义,使其不包含指针,或者需要解析接收到的数据,并逐个字段填充结构。