2

引数の変数リストをバイト配列にシリアル化する C 実装があります。したがって、特定の数の変数をファイルに保存できます。

C のコードは次のようになります。

static uint8_t byte_array[1024];

/* In this example, we assume that fmt contains only 'c', 'i', or 'f'
   We also assume that an argument is available for each char in fmt.
*/

uint8_t * serialize_args(const char *fmt, ...) {
  char *ptr = fmt;
  uint32_t idx = 0;
  va_list args;
  va_start(args, fmt);

  while(*ptr != NULL) {
    char p = *ptr++;
    char c;
    int i;
    float f;

    switch(p) {
      case 'c':  /* serialize char */
        c = va_arg(args, int32_t);
        byte_array[idx++] = (uint8_t) c;
        break;
      case 'i':  /* serialize int */
        i = va_arg(args, int32_t);
        memcpy(&byte_array[idx], &i, sizeof i);
        idx += sizeof i;
        break;
      case 'f':  /* serialize float */
        f = (float)va_arg(args, double);
        memcpy(&byte_array[idx], &f, sizeof f);
        idx += sizeof f;
        break;
    }
  }    
  va_end(args, fmt);

  byte_array[idx++] = 0;
  return byte_array;
}

ここで、これを C++ に翻訳したいとしましょう。どのコンテナが最適ですか? ベクトル ? 次に、次のようになります。

vector<uint8_t> serialize_args(const char *fmt, ...) {
  char *ptr = fmt;

  vector<uint8_t> byte_array;

  va_list args;
  va_start(args, fmt);

  while(*ptr != NULL) {
    char p = *ptr++;
    char c;
    int i;
    float f;

    switch(p) {
      case 'c':  // serialize char
        c = (char)va_arg(args, int32_t);
        byte_array.push_back(c);  // do I need a cast ?
        break;
      case 'i':  // serialize int
        i = va_arg(args, int32_t);
        // here how do I memcpy to a vector ?
        break;
      case 'f':  // serialize float
        f = (float)va_arg(args, double);
        // here how do I memcpy to a vector ?
        break;
    }
  }    

  va_end(args, fmt);

  return byte_array;
}

なにか提案を ?

4

1 に答える 1