我想将存储在 32 位无符号整数中的值放入四个字符中,然后将每个字符的整数值存储在一个字符串中。
我认为第一部分是这样的:
char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
我想将存储在 32 位无符号整数中的值放入四个字符中,然后将每个字符的整数值存储在一个字符串中。
我认为第一部分是这样的:
char a = orig << 8;
char b = orig << 8;
char c = orig << 8;
char d = orig << 8;
假设“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);
顺便说一句,我不确定这是否总是正确的。(编辑:确实,它是字节序正确的,因为位移操作不应该受到字节序的影响)
希望这可以帮助。
如果您真的想先提取单个字节:
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];
或者使用 unsigned long 和四个字符的并集:
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 架构。
使用union
. (这里要求的是示例程序。)
#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;
不完全确定您所说的“将这些值中的每一个的整数值存储到一个字符串中是什么意思。你想0x10111213
变成"16 17 18 19"
,还是什么?
对于十六进制:
sprintf(buffer, "%lX", orig);
对于十进制:
sprintf(buffer, "%ld", orig);
用于snprintf
避免缓冲区溢出。