【问题标题】:C++ Split Int Into 4 Parts (32 Bit Machine)C++ 将 Int 拆分为 4 个部分(32 位机器)
【发布时间】:2018-08-19 07:43:20
【问题描述】:

好吧,如果我有这样的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 个单独的部分?

【问题讨论】:

  • 在这种情况下,您如何定义“不起作用”?它有什么不同?

标签: c++ memory int 32-bit


【解决方案1】:

您的代码确实令人困惑,因为我不确定它为什么会在声明中转换为int 时起作用。您可以通过将 32 位 int 转换为 char * 来读取每个单独的字节,其中 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 在确定整数的内存布局中的作用。机器可以选择使用大端或小端布局,这将改变字节的打印顺序以及如何修改int

【讨论】:

  • 感谢您的回复。此外,转换为 int 简单地将原始内存地址转换为 4 字节整数,因此我可以在变量的内存地址中进行加减运算,而不会出现任何编译错误。假设变量“example”位于内存中的0x12341234,我在示例代码sn-p中所做的基本上是*(char*)(0x12341234 + (0x01 * i))
  • @Coder1337 我现在看到了。我知道那将如何工作。冒着迂腐的风险,我会警告你这可能会失败,因为指向int case 的指针是实现定义的,如果指针地址超出int 的范围,可能会导致未定义的行为。
  • 在我看来,联合是一种更好的方法。它允许您以不同的方式查看相同的值,而无需使用原始指针并重新转换以将指针强制为其他类型。
  • @ttemple 我认为union 更漂亮一些,尽管您需要熟悉C++ 中不太常见的结构,例如union。冒着听起来像语言律师的风险,从技术上讲,只有我的版本可以保证在所有系统上工作(暂时忽略字节顺序问题)。您的版本实际上会导致未定义的行为,因为您一次只能读取/写入 union 的成员变量,尽管它会在我所知道的所有现代系统上执行您所期望的操作。
【解决方案2】:
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.

【讨论】:

    【解决方案3】:
    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) ;
    

    【讨论】:

      猜你喜欢
      • 2015-12-19
      • 1970-01-01
      • 2013-12-05
      • 2019-01-05
      • 1970-01-01
      • 2018-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多