Link Search Menu Expand Document

サマリ:base64のソースコードリーディング8回目

base64を読もう⑧〜base_decode_ctx編〜

  size_t outleft = *outlen;
  bool ignore_newlines = ctx != NULL;
  bool flush_ctx = false;
  unsigned int ctx_i = 0;

  if (ignore_newlines)
    {
      ctx_i = ctx->i;
      flush_ctx = inlen == 0;
    }

コンテキストがNULLでないならtrueNULLならfalseを入れています。更に、コンテキストがNULLでないなら、inlenをチェックし、0ならflush_ctxtrueを入れています。ctx->iはイニシャライザで0が設定されますから、デコード対象データ(コンテキスト)が存在する場合、*outlen > 0ignore_newlines==trueflush_ctx == falsectx_i==0となっているはずです。

  while (true)
    {
      size_t outleft_save = outleft;
      if (ctx_i == 0 && !flush_ctx)
        {
          while (true)
            {
              /* Save a copy of outleft, in case we need to re-parse this
                 block of four bytes.  */
              outleft_save = outleft;
              if (!decode_4 (in, inlen, &out, &outleft))
                break;

              in += 4;
              inlen -= 4;
            }
        }

// :

    }

コンテキストが存在した場合『4バイトごとに再解析を行うために、outleftのコピーを退避しておく』。その後、4バイトをデコード対象として処理し、デコードに失敗した場合は終了する。デコードに成功した場合は、入力ストリームのポインタを4移動させる。

###理解したこと

  • ここが核心に近い

###宿題

  • decode_4がデコードの核心なので、後で読む

Back to top

Copyright © 2021- Akira Otaka All rights reserved.