0

私の C++ の知識は悪臭を放ち、C++ 関数を正しい方法で変換する必要があります。

これは私が持っているコードです ( http://www.sky.franken.de/doxy/xmlstorage/c++/base64_8cpp_source.htmlから抽出)。

void* base64_decode(const char* s, size_t& data_len)
{
  size_t len = strlen(s);

  if (len % 4)
          throw Exception("invalid BASE64 string length");

  unsigned char* data = (unsigned char*) malloc(len/4*3);

  int n[4];
  unsigned char* q = (unsigned char*) data;

  for(const char*p=s; *p; ) {
          n[0] = POS(*p++);
          n[1] = POS(*p++);
          n[2] = POS(*p++);
          n[3] = POS(*p++);

          if (n[0]==-1 || n[1]==-1)
              throw Exception("invalid BASE64 encoding");

      if (n[2]==-1 && n[3]!=-1)
              throw Exception("invalid BASE64 encoding");

      q[0] = (n[0] << 2) + (n[1] >> 4);
      if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2);
      if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3];
      q += 3;
  }

       data_len = q-data - (n[2]==-1) - (n[3]==-1);

       return data;
   }

このヘッダーを持つには、この前の関数が必要です

void * base64_decode(const char* s, size_t * data_len)

つまり、ヘッダーの「&」と「*」の問題であることがわかります。ご覧のとおり、最初の関数にはこれがあります

size_t& data_len

ヘッダーにありますが、フォームのデータ長を受け入れる必要があります

size_t * data_len

1 番目を 2 番目に変換する方法、つまり、"size_t *" として提供される data_len で機能させるために、メソッドでどのような変更を行う必要があるのか​​ わかりません。

4

3 に答える 3

2
void* base64_decode(const char* s, size_t* data_len_ptr)
{
    size_t len = strlen(s);

    if (len % 4)
        [NSException raise:@"Invalid input in base64_decode" format:@"%d is an invalid length for an input string for BASE64 decoding", len];

    unsigned char* data = (unsigned char*) malloc(len/4*3);

    int n[4];
    unsigned char* q = (unsigned char*) data;

    for(const char*p=s; *p; )
    {
        n[0] = POS(*p++);
        n[1] = POS(*p++);
        n[2] = POS(*p++);
        n[3] = POS(*p++);

        if (n[0]==-1 || n[1]==-1)
            [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"];

        if (n[2]==-1 && n[3]!=-1)
            [NSException raise:@"Invalid input in base64_decode" format:@"Invalid BASE64 encoding"];

        q[0] = (n[0] << 2) + (n[1] >> 4);
        if (n[2] != -1) q[1] = ((n[1] & 15) << 4) + (n[2] >> 2);
        if (n[3] != -1) q[2] = ((n[2] & 3) << 6) + n[3];
        q += 3;
    }

    // make sure that data_len_ptr is not null
    if (!data_len_ptr)
        [NSException raise:@"Invalid input in base64_decode" format:@"Invalid destination for output string length"];

    *data_len_ptr = q-data - (n[2]==-1) - (n[3]==-1);

    return data;
}

関数の呼び出しは次のようになります。

const char* string = /*Base-64 encoded string*/;
size_t data_len;
void* decoded_data = base64_decode(string, &data_len);
// the length of the decoded data is now indicated by data_len
于 2012-07-24T16:43:58.667 に答える
1

あなたがそれを見るときはいつでも、そしてあなたがそれ自身だけを見るときはいつでも、data_len.somethingそれをに変えてください。data_len->somethingdata_len*data_len

于 2012-07-24T16:42:24.157 に答える
1

最後から 2 番目の行を次のように置き換えます。

*data_len = q-data - (n[2]==-1) - (n[3]==-1); 

または、iOS 用の Base64 の既製の実装を見つけてください。それらは数多くあります。

于 2012-07-24T16:45:56.267 に答える