(議論のためにエンディアンを無視します - これは単なるテストケース/概念実証です - そして私は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。たとえば、 "what is " のような C のヘルパー関数を呼び出してsizeof(int)、n バイトを取得し、C 関数を呼び出して "これらのバイトを int に変換" することはできますが、この場合、新しい C コードを追加することはできません。解凍」は、私が「すべき」と知っていることに基づいて、OCaml で行う必要があります。s のブロックで文字列を反復処理するか、sizeof'\0' を探すだけの問題ですか、それとも賢い方法はありますか? ありがとう!