【解決方法】C/C++ の UTF16BE 文字セットを使用して文字列を Base64 でエンコードする

プログラミングQA


こんにちは、みんな

文字列を入力として受け取り、文字セットUTF16BEを使用してBase64を出力するC関数を作成する必要があります。

以下の Base64_code 関数は UTF8 を生成します。

誰かが私を助けてくれることを本当に願っています

皆さんありがとう

ジョバンニ

私が試したこと:

void Base64_code(IN const CHAR* strIn, OUT CString& strOut)
{
    const static CHAR base64ABC[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
    strOut.Empty();
    const size_t len = strlen(strIn);
    for (size_t i = 0; i < len; i += 3) 
    {
        LONG l = (((LONG)strIn[i]) << 16) | (((i + 1) < len) ? (((LONG)strIn[i + 1]) << 8) : 0) | (((i + 2) < len) ? ((LONG)strIn[i + 2]) : 0);

        strOut += base64ABC[(l >> 18) & 0x3F];
        strOut += base64ABC[(l >> 12) & 0x3F];
        if (i + 1 < len) strOut += base64ABC[(l >> 6) & 0x3F];
        if (i + 2 < len) strOut += base64ABC[(l) & 0x3F];
    }
    switch (len % 3) 
    {
    case 1:
        strOut += '=';
    case 2:
        strOut += '=';
    }
}

解決策 2

これを行うには 2 つの簡単な方法があります。
1. 文字を作成するたびに、それを同等の UTF16BE に変換し、それを出力配列に格納します。
2. データ ブロック全体を変換した後、結果の文字列を同等の UTF16BE に変換します。

解決策 1

以下のコードを試してみてください

#include
#include
#include <文字列.h>

静的なconst charのbase64_table[65] = “ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/”;

char* utf16be_base64_encode(const char* 入力) {
サイズ_t 入力_len = strlen(入力);
サイズ_t 出力_len = ((入力_len * 2 + 1) / 3) * 4 + 1;
char* 出力 = (char*)malloc(output_len);
if (出力 == NULL) {
printf(“メモリの割り当てに失敗しました。\n”);
NULL を返します。
}

サイズ_t i、j;
uint32_t val = 0;
uint8_t バイト[3];
size_t 出力位置 = 0;

for (i = 0; i < input_len; i += 2) {
バイト[0] = (uint8_t)入力[i];
バイト[1] = (uint8_t)入力[i + 1];
val = (バイト[0] << 8) | バイト[1]; for (j = 0; j < 4; ++j) {
出力[output_pos++] =base64_テーブル[(val >> 18) & 0x3F];
val <<= 6;
}
}

if (input_len % 2 != 0) {
バイト[0] = (uint8_t)入力[input_len – 1];
バイト[1] = 0;
val = (バイト[0] << 8) | バイト[1];
for (j = 0; j < 3; ++j) {
出力[output_pos++] =base64_テーブル[(val >> 18) & 0x3F];
val <<= 6;
}
出力[output_pos++] = ‘=’;
}

出力[output_pos] = ‘\0’;
出力を返します。
}

int main() {
const char* input = “こんにちは、世界!”;
char* エンコード = utf16be_base64_encode(入力);
if (エンコードされた != NULL) {
printf(“Base64 (UTF-16BE): %s\n”、エンコード済み);
無料(エンコード);
}

0を返します。
}

コメント

タイトルとURLをコピーしました