gpt4 book ai didi

将 void 指针转换为结构并将其移动给定大小

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:23 25 4
gpt4 key购买 nike

我得到了一个包含 3 个不同结构的二进制文件,我想将其读入我的程序。在我读取第一个结构后,我存储它的大小,然后我假设将我的 void 指针 + 第一个结构长度转换为一个 struct ip_hdr *(这是第二个结构),然后读取它的所有值。

但问题是我不明白你如何移动一个空指针。我了解到 void 指针不具有与 int 指针相同的算术规则。

我想做这样的事情:

ptr = (struct ip_hdr *)ptr) + (ethRes));

但这不起作用,我收到以下错误消息:

Expression must be a pointer to a complete object type

这是我的代码:

#pragma warning(disable: 4996)
#include <stdio.h>
#include <stdlib.h>
#include "framehdr.h"
#include <crtdbg.h>

int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

FILE *fileOpen = fopen("C:\\Users\\Viktor\\source\\repos\\Laboration_3\\Laboration_3\\TCPdump", "rb");


//Pointers and variables
struct ethernet_hdr eth;
struct ethernet_hdr *ethPtr;
struct ip_hdr ip;
struct ip_hdr *ipPtr;
struct tcp_hdr tcp;
struct tcp_hdr *tcpPtr;

if (fileOpen == NULL)
{
printf("Error\n");
}
else
{
printf("Success\n");
}

char ethrr[10];
fscanf(fileOpen, "%s", ethrr);
int length = atoi(ethrr);
printf("Nr: %d\n", length);

void *ptr;
ptr = (void *)malloc(length);
fread(ptr, sizeof(eth), 1, fileOpen);

int ethRes = sizeof(((struct ethernet_hdr*)ptr)->dhost) +
sizeof(((struct ethernet_hdr*)ptr)->shost) +
sizeof(((struct ethernet_hdr*)ptr)->type);
printf("%d\n", ethRes);
printf("ptr1: %d\n", &ptr);

system("pause");
fclose(fileOpen);


return 0;
}

我现在它坏了,但我还没有完成它。现在只需要有关指针的帮助。

最佳答案

这应该可行,假设结构与文件中的任何内容兼容(通常将结构“原始”保存到磁盘是一个坏主意,内存中结构的确切布局取决于编译器并且不够稳定用作文件格式):

const struct ip_hdr * const ip = (struct ip_hdr *) ((struct ethernet_hdr *) ptr + 1);

这会将“1”添加到 ethernet_hdr 类型的指针,无论以太网头结构的大小如何,这都会使实际指针值前进。然后将结果转换为 struct ip_hdr *

我认为这就是您想要做的。您可以通过向 char * 添加字节来实现,但这有什么意义呢?

您不能直接添加到 void 指针,因为指针算法总是以所指向的任何单位为单位,并且 void 没有大小。

关于将 void 指针转换为结构并将其移动给定大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47885796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com