C ++でcharの整数値を取得するにはどうすればよいですか?
-
05-07-2019 - |
質問
32ビットの符号なし整数に格納されている値を取得し、4つの文字に入れてから、これらの各文字の整数値を文字列に格納します。
最初の部分は次のようになると思います:
char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
解決
最初に個々のバイトを抽出したい場合:
unsigned char a = orig & 0xff;
unsigned char b = (orig >> 8) & 0xff;
unsigned char c = (orig >> 16) & 0xff;
unsigned char d = (orig >> 24) & 0xff;
または:
unsigned char *chars = (unsigned char *)(&orig);
unsigned char a = chars[0];
unsigned char b = chars[1];
unsigned char c = chars[2];
unsigned char d = chars[3];
または、符号なしlongと4文字の結合を使用します:
union charSplitter {
struct {
unsigned char a, b, c, d;
} charValues;
unsigned int intValue;
};
charSplitter splitter;
splitter.intValue = orig;
// splitter.charValues.a will give you first byte etc.
更新:friolが指摘したように、ソリューション2と3はエンディアンネスに依存しません。 a
、 b
、 c
、および d
が表すバイトは、CPUアーキテクチャによって異なります。
他のヒント
「orig」と言いましょう。値を含む32ビット変数です。
次のようなことをしたいと思います:
unsigned char byte1=orig&0xff;
unsigned char byte2=(orig>>8)&0xff;
unsigned char byte3=(orig>>16)&0xff;
unsigned char byte4=(orig>>24)&0xff;
char myString[256];
sprintf(myString,"%x %x %x %x",byte1,byte2,byte3,byte4);
ちなみに、これが常にエンディアンで正しいかどうかはわかりません。 (編集:実際、エンディアンは正しいです。ビットシフト操作はエンディアンの影響を受けないためです)
これがお役に立てば幸いです。
ユニオン
を使用します。 (ここで要求されているのはサンプルプログラムです。)
#include <<iostream>>
#include <<stdio.h>>
using namespace std;
union myunion
{
struct chars
{
unsigned char d, c, b, a;
} mychars;
unsigned int myint;
};
int main(void)
{
myunion u;
u.myint = 0x41424344;
cout << "a = " << u.mychars.a << endl;
cout << "b = " << u.mychars.b << endl;
cout << "c = " << u.mychars.c << endl;
cout << "d = " << u.mychars.d << endl;
}
ジェームズが述べたように、これはプラットフォーム固有です。
完全ではない:
char a = orig & 0xff;
orig >>= 8;
char b = orig & 0xff;
orig >>= 8;
char c = orig & 0xff;
orig >>= 8;
char d = orig & 0xff;
これらの各値の整数値を文字列に&quot;で格納することの意味が正確にわかりません。 0x10111213
を&quot; 16 17 18 19&quot;
に変えますか、それとも何ですか?
16進数の場合:
sprintf(buffer, "%lX", orig);
小数の場合:
sprintf(buffer, "%ld", orig);
snprintf
を使用して、バッファオーバーフローを回避します。
所属していません StackOverflow