2

int をバイト配列に変換してから、base64 を実行して Azure Rest API の blockId を作成しようとしています。int を base64 文字列に変換するときの最初のビットは正しいです。

int a = 127;
int b = 4000;

C#:

byte[] blockIdBytes = BitConverter.GetBytes(a);
string blockIdBase64 = Convert.ToBase64String(blockIdBytes);

a"fwAAAA==" を与え、"oA8AAA==" をb与える

C++

QByteArray temp;

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

a"fwAAAA==" をb与え、"oA8AAA==" を与えます (上記と同じ値で、正しいです)

問題は、base64-string を int に変換しようとしたときですか? 私の bytearray から int へのメソッドは、127 より大きい数値では機能しません。なぜですか?

int result = 0;

for(int i = temp.size(); i >= 0; i--) {
    result = (result << 8) + temp[i];
}

127 は機能しますが、(たとえば) 128 を実行すると、結果は "-128" になります。溢れてるのは分かるけど、なんでどこに?

編集:

試した:

QByteArray temp;
int a = 340;

for(int i = 0; i < sizeof(a); i++) {
  temp.append((unsigned char)(a >> (i * 8)));
}

実際に変換すると「340」、「255」は「-1」、「256」は「256」になります。

4

1 に答える 1

1

逆に変換するときは、temp[i] のすべての値をとして扱うunsigned char か、符号付きビットを無視する必要があります。以下のコード スニペットでは、temp[i] を整数に昇格させてから、符号付きビットがある場合は明示的に 0 にリセットして正にします。

result = (result << 8) + ((int)(temp[i]) & 0xFF)

を使用して同じことを達成できるはずです

result = (result << 8) + ((unsigned char)(temp[i]))

于 2012-04-24T06:01:28.033 に答える