我正在尝试修复废弃软件程序的这一部分,因为我找不到替代程序。
如您所见,PUSH 指令的数据顺序错误,而以太坊是大端机器(地址正确表示,因为它们使用较小的类型)。
另一种方法是运行porosity.exe --code '0x61004b60026319e44e32' --disassm
u256
类型定义为
using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
这是重现该错误的最小示例:
#include <sstream>
#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_int.hpp>
using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
int main() {
std::stringstream stream;
u256 data=0xFEDEFA;
for (int i = 0; i<5; ++i) { // print only the first 5 digits
uint8_t dataByte = int(data & 0xFF);
data >>= 8;
stream << std::setfill('0') << std::setw(sizeof(char) * 2) << std::hex << int(dataByte) << " ";
}
std::cout << stream.str();
}
因此,数字被转换为字符串,每个字节之间有一个空格(并且只有第一个字节)。
但后来我遇到了字节顺序问题:字节以相反的顺序打印。我的意思是,例如,31722
是8a 02 02
在我的机器上编写的,并且02 02 8a
在为大端目标编译时。
所以我没有调用哪个 boost 函数,我修改了代码:
#include <sstream>
#include <iostream>
#include <iomanip>
#include <boost/multiprecision/cpp_int.hpp>
using u256 = boost::multiprecision::number<boost::multiprecision::cpp_int_backend<256, 256, boost::multiprecision::unsigned_magnitude, boost::multiprecision::unchecked, void>>;
int main() {
std::stringstream stream;
u256 data=0xFEDEFA;
for (int i = 0; i<5; ++i) {
uint8_t dataByte = int(data >> ((32 - i - 1) * 8));
stream << std::setfill('0') << std::setw(sizeof(char) * 2) << std::hex << int(dataByte) << " ";
}
std::cout << stream.str();
}
现在,为什么我的 256 位整数大多打印为系列00 00 00 00 00
?