2016-07-19 5 views
-1

130ABF(16進数)値を整数には、に等しい(10進数)、 は、だから私のバイト配列が変換char型のバイトがある。例えば

char buf[3] = {0x13 , 0x0A , 0xBF}; 

であると私は10進値を取得する必要がありますバイト配列以下は

は私のサンプルコードです:

#include<iostream> 
using namespace std; 
int main() 
{ 
    char buf[3] = {0x13 , 0x0A , 0xBF}; 
    int number = buf[0]*0x10000 + buf[1]*0x100 + buf[2]; 
    cout<<number<<endl; 
    return 0; 
} 

と結果は次のとおりです。(間違った)

1247679 

私は

char buf[3] = {0x13 , 0x0A , 0xBF}; 

に変更しない限り

int buf[3] = {0x13 , 0x0A , 0xBF}; 

それから正しい結果が得られます。

残念ながら、私は配列の文字のタイプとして設定する必要があります、誰もこれを解決する方法を知っていますか?

+1

エンディアンを認識していますか?あなたは実際にビッグエンディアンフォーマットを保証しています。 –

+1

@πάνταῥεῖ良い点ですが、整数を計算する方法はエンディアン依存ではありません。私は彼が "手書きの16進表現"を意味すると仮定しています – Rerito

答えて

6

として配列を定義します。

unsigned char buf[3]; 

がcharが署名することができることを覚えておいてください。

UPDATE: "char"は "signed char"または "unsigned char"と同等の可能性のある型ですが、標準では決まっていません。

0

評価の前に配列要素はintに提供されます。だから、あなたは次の取得署名としてcharコンパイラの扱い場合(intを想定し、32ビットである):

int number = 19*0x10000 + 10*0x100 + (-65); 

あなたがunsigned char arr[]として、あなたの配列を宣言、またはマスキングプラスシフトを使用することができ、そのような影響を避けるために:

int number = ((buf[0] << 16) & 0xff0000) 
      | ((buf[1] << 8) & 0x00ff00) 
      | ((buf[2] << 0) & 0x0000ff; 
+0

charが署名されている場合、3番目のものは大きな負の数値 –

+0

@ M.Mです。私の悪い。ありがとう! – Sergio

0

char配列に符号があるので、最後の要素(​​)を初期化するときに、格納できる最大値が127である間に191を割り当てようとしています。狭変換が発生しました...回避策は、以下:

unsigned char[3] = { 0x13, 0x0A, 0xBF }; 

これは、変換の絞り込みを防止します。あなたのコンパイラから警告が出されているはずです。

関連する問題