代码之家  ›  专栏  ›  技术社区  ›  Coder1337

C++将Int拆分为4部分(32位机器)

  •  0
  • Coder1337  · 技术社区  · 6 年前

    好的,如果我有一个像这样的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个独立的部分呢?

    3 回复  |  直到 6 年前
        1
  •  2
  •   Daniel    6 年前

    你的代码真的很混乱,因为我不知道为什么它在演员阵容 int 在声明中。您可以读取32位 内景 通过将其浇铸到 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 要修改 内景 逐字节。

    此外,您还应该查找 endianness 在确定整数的内存布局时。机器可以选择使用大端或小端布局,这将改变字节的打印顺序以及如何修改 内景

        2
  •  1
  •   ttemple    6 年前
    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
  •  1
  •   user3344003    6 年前
    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) ;