将结构转换为字节数组并存储在数据库中。读取 db 并获取字节数组以在 C 中重新创建结构

标签 c arrays struct filesystems gdbm

大家好,很抱歉问这个问题,但我可以找到任何合适的解决方案。 我正在开发一个文件系统,将每个文件节点保存为 GDBM 数据库中的键值对。 我有一个具有一些属性的结构,我将其转换为字节数组

结构 mystruct:

typedef struct nold{
char* name;
char* surname;
 int age;
}mystruct;

我将其转换为字节数组

dead.name="john";
dead.surname="doe";
dead.age=22;

//copy bytes of the our struct 
char buffer[sizeof(dead)]; 
memcpy(buffer, &dead, sizeof(dead));

为了存储在数据库中,我们使用如下数据结构:

 typedef struct {
         char *dptr;
         int  dsize;
      } datum

我填写的数据结构如下:

//create a key datum
char* k="file.txt";
key.dptr=k;
key.dsize=strlen(k)+1;



//create a value datum  here I assign bytes
value.dptr=buffer;
value.dsize = sizeof(dead);

现在我将其作为键值对存储在GDBM中

然后在另一个文件中,我读取存储的数据并尝试将其重新转换回结构

datum result;

//read
result=gdbm_fetch(file,key);

char* bytes=result.dptr;

mystruct* reborn;

reborn=(mystruct*)bytes;


//print from our new struct
printf("%s\n",reborn->name);
printf("%s\n",reborn->surname);
printf("%d\n",reborn->age);

它打印以下内容:

E���D$�$ˈ�k����E��
$�$ˈ�k����E��
22

它设法恢复结构,但 char* 的数据丢失了。仅涵盖整数数据。知道为什么会这样吗?怎么解决呢?如果无法通过存储字节数组来解决,那么将字节数组转换为十六进制或base64 并按原样存储即可。

我真的很苦恼这个问题。提前谢谢你。

最佳答案

结构体内部的指针只是指向字符数组的指针,而不是字符数组本身:

typedef struct nold{
   char* name;
   char* surname;
   int age;
}mystruct;

mystruct s;
s.name = "Salam";

这将为字符串“Salam”保留一个内存空间,将字符串Salam放入其中并返回指向s.name的指针。

现在您要将整个结构复制到其他内容中,您正在使用 sizeof(mystruct) 从结构地址复制,它实际上并不保存字符串“Salam”,它只是保存一个指向“Salam”的指针。

如果你想这样做,你必须为名称预先分配一些空间:

#define MAX_NAME_LEN    50
typedef struct nold{
   char name[MAX_NAME_LEN];
   char surname[MAX_NAME_LEN];
   int age;
}mystruct;

mystruct s;
strcpy(s.name, "Salam");

现在 memcpy 可以工作了

mystruct d;
memcpy(&d, &s, sizeof(mystruct);

关于将结构转换为字节数组并存储在数据库中。读取 db 并获取字节数组以在 C 中重新创建结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41166441/

相关文章:

c - 关于windows下使用PQconnectdb()连接pq服务器时的认证

c - 以十六进制覆盖 exe 的字节

c - 是否可以创建嵌套结构数组?如何?

hadoop - 如何将数据插入 Hive 中的复杂数据类型 "Struct"

c - 将结构指针或数组作为函数参数传递

c - "Push-to-make"键盘按键的风格使用

c++ - 如何获取当前工作目录(current working folder)名称而不是路径名?

c - 尝试将文件解析为数组但获得额外的数字

javascript - 为什么使用 "new"创建 Javascript 数组被认为是错误的?

c# - C#中如何清空数组?