(为了争论而忽略字节顺序——这只是一个测试用例/概念证明——我也永远不会strcpy
在实际代码中使用!)
考虑以下简单的 C 代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* variables of type message_t will be stored contiguously in memory */
typedef struct {
int message_id;
char message_text[80];
} message_t;
int main(int argc, char**argv) {
message_t* m = (message_t*)malloc(sizeof(message_t));
m->message_id = 1;
strcpy(m->message_text,"the rain in spain falls mainly on the plain");
/* write the memory to disk */
FILE* fp = fopen("data.dat", "wb");
fwrite((void*)m, sizeof(int) + strlen(m->message_text) + 1, 1, fp);
fclose(fp);
exit(EXIT_SUCCESS);
}
它写入的文件可以很容易地从磁盘读回:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
int message_id;
char message_text[80];
} message_t;
int main(int argc, char**argv) {
message_t* m = (message_t*)malloc(sizeof(message_t));
FILE* fp = fopen("data.dat", "rb");
fread((void*)m, sizeof(message_t), 1, fp);
fclose(fp);
/* block of memory has structure "overlaid" onto it */
printf("message_id=%d, message_text='%s'\n", m->message_id, m->message_text);
exit(EXIT_SUCCESS);
}
例如
$ ./write
$ ./read
message_id=1, message_text='the rain in spain falls mainly on the plain'
我的问题是,在 OCaml 中,如果我只有:
type message_t = {message_id:int; message_text:string}
我将如何获得这些数据?Marshal
做不到,也做不到input_binary_int
。例如,我可以调用 C 中的辅助函数,例如“what is sizeof(int)
”,然后获取 n 个字节并调用 C 函数以“将这些字节转换为 int”,但在这种情况下,我无法添加任何新的 C 代码,即“解包”必须在 OCaml 中完成,基于我所知道的“应该”。是否只是在sizeof
s 块中迭代字符串或寻找 '\0' 还是有一个聪明的方法?谢谢!