2012-04-24 10 views
2

私はバイト配列にintを変換しようとしていますし、Azure Rest APIのblockIdを作成するためにbase64を行います。バイト配列とintに大きい数値で同じ値を与える

int a = 127; 
int b = 4000; 

C#の:私はbase64文字列にint型に変換するところとき、私は、正しい最初のビットを得ている=

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

aは "fwAAAA ==" を与えるとbは」oA8AAAを与えます= fwAAAを "

C++

QByteArray temp; 

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

aができます" A == "となり、bは" oA8AAA == "を返します(これは正しい値です)

ここで、base64文字列をintに変換しようとすると問題が発生しますか?私のbytearrayからintメソッドは127より大きい数値では機能しません、なぜですか?

127が動作しますが、128(たとえば)の場合、結果は「-128」になります。私はそれが溢れていることを知っていますが、なぜそしてどこですか?

EDIT:

が試み:

QByteArray temp; 
int a = 340; 

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

をactaully "340" を与え、私は戻ってそれを変換する場合、 "255" は "-1" 与え、 "256" は "256"

+0

"temp"に追加するときに符号付き文字としてキャストしているためです。バイトは、UNSIGNED charと等価です。 (int i = 0; i >())の代わりに、符号付きchar(範囲-127〜127) i * 8)))); } –

+0

でも変更しても同じ問題が発生する – chikuba

+1

temp.size()から0にループする2番目の最後のコードブロックでは、どのようにtemp.sizeの位置を参照解除することができますか()?配列のサイズが8の場合、temp [7]は配列の最後の要素ですか、いいえ? – ds1848

答えて

1
を与えます

を変換するときは、temp [i]のすべての値をunsigned char として扱うか、符号付きビットを無視する必要があります。以下のコードでは、[i]のいずれかの場合には、明示的に我々はそれが正

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

作る0に符号ビットをリセットし、その後、あなたが

を使用して同じことを達成することができるはず整数にあなたは一時を促進終わるスニペット

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

関連する問題