C++ 将 Int 拆分为 4 个部分(32 位机器)
C++ Split Int Into 4 Parts (32 Bit Machine)
好吧,如果我有这样的 int(用来存储一行 ASM)
int example = 0x38600000; //0x38600000 = li r3, 0
我如何将这个 int 分成 4 个独立的部分?我想到了这个
int example = 0x38600000;
char splitINT[4];
for(int i = 0; i < 4; i++)
{
splitINT[i] = *(char*)(((int)&example + (0x01 * i)));
}
//splitINT[0] = 0x38;
//splitINT[1] = 0x60;
//splitINT[2] = 0x00;
//splitINT[3] = 0x00;
当从我的可执行文件位于 运行 的进程中读取内存时,上面的代码实际上工作得很好,但是当尝试从其内部读取程序自己的内存时,这不起作用,如代码示例所示以上。
那么我还能如何将一个 int 拆分为 4 个独立的部分?
union split_union
{
int as_int;
char as_char[4];
}
// either initialize like this...
split_union example{0x38600000};
// or assign like this...
split_union ex;
ex.as_int = 0x38600000;
//example.as_char[0] = 0x00;
//example.as_char[1] = 0x00;
//example.as_char[2] = 0x60;
//example.as_char[3] = 0x38;
// correct order for Visual Studio on x86.
你的代码真的很混乱,因为我不确定为什么它在声明中转换为 int
的情况下仍然有效。您可以通过将其转换为 char *
来读取 32 位 int
的每个单独字节,其中 char
是您机器上一个字节的大小。
int example = 0x38600000;
char *bytepointer = reinterpret_cast<char*>(&example);
for(int i = 0; i < 4; i++)
{
std::cout << static_cast<int>(bytepointer[i]) << " ";
}
std::cout << std::endl;
也可以用bytepointer
逐字节修改int
的内存内容。
此外,您还应该查看 endianness 在确定整数的内存布局中的作用。机器可以选择使用 big- 或 small-endian 布局,这将改变打印字节的顺序以及修改 int
.
的方式
unsigned char c1 = static_cast<unsigned char>(example & 0xFF) ;
unsigned char c2 = static_cast<unsigned char>((example >> 8) & 0xFF) ;
unsigned char c3 = static_cast<unsigned char>((example >> 16) & 0xFF) ;
unsigned char c4 = static_cast<unsigned char>((example >> 24) & 0xFF) ;
好吧,如果我有这样的 int(用来存储一行 ASM)
int example = 0x38600000; //0x38600000 = li r3, 0
我如何将这个 int 分成 4 个独立的部分?我想到了这个
int example = 0x38600000;
char splitINT[4];
for(int i = 0; i < 4; i++)
{
splitINT[i] = *(char*)(((int)&example + (0x01 * i)));
}
//splitINT[0] = 0x38;
//splitINT[1] = 0x60;
//splitINT[2] = 0x00;
//splitINT[3] = 0x00;
当从我的可执行文件位于 运行 的进程中读取内存时,上面的代码实际上工作得很好,但是当尝试从其内部读取程序自己的内存时,这不起作用,如代码示例所示以上。
那么我还能如何将一个 int 拆分为 4 个独立的部分?
union split_union
{
int as_int;
char as_char[4];
}
// either initialize like this...
split_union example{0x38600000};
// or assign like this...
split_union ex;
ex.as_int = 0x38600000;
//example.as_char[0] = 0x00;
//example.as_char[1] = 0x00;
//example.as_char[2] = 0x60;
//example.as_char[3] = 0x38;
// correct order for Visual Studio on x86.
你的代码真的很混乱,因为我不确定为什么它在声明中转换为 int
的情况下仍然有效。您可以通过将其转换为 char *
来读取 32 位 int
的每个单独字节,其中 char
是您机器上一个字节的大小。
int example = 0x38600000;
char *bytepointer = reinterpret_cast<char*>(&example);
for(int i = 0; i < 4; i++)
{
std::cout << static_cast<int>(bytepointer[i]) << " ";
}
std::cout << std::endl;
也可以用bytepointer
逐字节修改int
的内存内容。
此外,您还应该查看 endianness 在确定整数的内存布局中的作用。机器可以选择使用 big- 或 small-endian 布局,这将改变打印字节的顺序以及修改 int
.
unsigned char c1 = static_cast<unsigned char>(example & 0xFF) ;
unsigned char c2 = static_cast<unsigned char>((example >> 8) & 0xFF) ;
unsigned char c3 = static_cast<unsigned char>((example >> 16) & 0xFF) ;
unsigned char c4 = static_cast<unsigned char>((example >> 24) & 0xFF) ;