0

Azure (http://msdn.microsoft.com/en-us/library/dd135726.aspx) の base64 エンコーディングを使用していますが、必要な文字列を取得する方法がわかりません。私は以下を行うC#でこれを行うことができます。

int blockId = 5000;
var blockIdBytes = BitConverter.GetBytes(blockId);
Console.WriteLine(blockIdBytes);
string blockIdBase64 = Convert.ToBase64String(blockIdBytes);
Console.WriteLine(blockIdBase64);

(LINQPadで)出力するもの:

Byte[] (4 items)
| 136         |
| 19          |
| 0           |
| 0           |

iBMAAA==

Qt/C++ でいくつかのアポラチを試しましたが、すべて間違った値を返しました。

const int a = 5000;
QByteArray b;

for(int i = 0; i != sizeof(a); ++i) {
  b.append((char)(a&(0xFF << i) >>i));
}

qDebug() << b.toBase64(); // "iIiIiA==" 
qDebug() << QByteArray::number(a).toBase64(); // "NTAwMA=="
qDebug() << QString::number(a).toUtf8().toBase64(); // "NTAwMA=="

C# 版と同じ結果を得るにはどうすればよいですか?

4

3 に答える 3

4

forループの問題については、私のコメントを参照してください。パスごとに 1 ビットずつシフトしていますが、実際には 8 ビットのはずです。個人的には、ループよりもこれを好みます。

    b.append(static_cast<char>(a >> 24)); 
    b.append(static_cast<char>((a >> 16) & 0xff)); 
    b.append(static_cast<char>((a >> 8) & 0xff)); 
    b.append(static_cast<char>(a & 0xff)); 

上記のコードは、ネットワーク標準バイト オーダー (ビッグ エンディアン) 用です。リトル エンディアンのバイト順のために、4 つの操作の順序を最後から最初に反転します。

于 2012-04-18T05:18:14.690 に答える
0

私は最終的に次のことをしました:

QByteArray temp;
int blockId = 5000;

for(int i = 0; i != sizeof(blockId); i++) {
  temp.append((char)(blockId >> (i * 8)));
}

qDebug() << temp.toBase64(); // "iBMAAA==" which is correct
于 2012-04-18T05:24:44.220 に答える
-1

スタイルが悪いと主張されるかもしれませんが、これはより明確になると思います...

int i = 0x01020304;
char (&bytes)[4] = (char (&)[4])i;

また、bytes[0]、bytes[1]、...を使用して各バイトに直接アクセスし、それらを使用してやりたいことを行うことができます。

于 2012-04-18T05:39:47.730 に答える