0

使用 Azure 的 base64 编码(http://msdn.microsoft.com/en-us/library/dd135726.aspx),我似乎不知道如何取回所需的字符串。我可以在 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++ 中,我尝试了一些 aporache,它们都返回了错误的值。

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有关您的循环问题,请参阅我的评论。每次传递都会多移动一位,但实际上应该是 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)); 

上面的代码用于网络标准字节顺序(大端)。将四个操作的顺序从最后一个翻转到第一个,以获得 little endian 字节顺序。

于 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 回答