Получение двоичных данных C из OCaml

(Игнорирование порядка байтов ради аргумента - это всего лишь тестовый пример / доказательство концепции - и я бы никогда не использовал 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}

Как я могу получить эти данные? Маршал не может этого сделать, и не может input_binary_int . Я могу вызвать вспомогательные функции в C, такие как «what is sizeof (int) », затем получить n байтов и вызвать функцию C, например, «преобразовать эти байты в int», но в этом случае я могу Не добавляйте новый код C, «распаковку» нужно производить в OCaml, исходя из того, что я знаю «должно» быть. Это просто вопрос перебора строки блоками размером размером s или поиск '\ 0', или есть хитрый способ? Спасибо!

5
задан Gaius 16 May 2011 в 21:48
поделиться