请仔细阅读和分析下面函数,保持函数原始逻辑功能不变, 不要遗漏逻辑细节,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码
要求如下:
1.保持原始函数定义不变,不要拆分函数
2.保持所有原始逻辑功能不变
3.结构体采用32位定义
4.严格保持protobuf字段映射关系,不要遗漏protobuf字段内容
5.提高执行效率,降低计算复杂度
6.已经给定的结构体名字和元素不要更改,详细的中文注释
7.自动添加中文注释说明功能逻辑
8.不使用 auto,使用显式 for 循环
特别注意:
1.函数中有关位操作不变,函数间的位操作一致
2.函数中的 HDDMXng::Conn::Conn 映射为
message Conn
{
optional uint32 bel0 = 1;
optional uint32 bel1 = 2;
optional uint32 pin0 = 3;
optional uint32 pin1 = 4;
optional uint32 speedidx = 5;
}
3.定义出conn_code、conn_code1、conn_code2、conn_code3 的位区域结构体并详细注释
4.将 _BYTE conn_msg[16] 映射为 HDDMXng::Conn conn_msg;
void HDDMSiteTypeConn::HDDMSiteTypeConn(HDDMSiteTypeConn *this)
{
int conn_code1; // eax
int conn_code2; // eax
LOBYTE(this->conn_code1) &= 0xF0u;
LOWORD(this->conn_code2) &= 0xFC00u;
conn_code1 = this->conn_code1;
LOWORD(this->conn_code) = 0;
conn_code1 |= 0x3FFF0u;
this->conn_code1 = conn_code1;
HIWORD(this->conn_code) = -1;
this->conn_code3 = -65536;
HIWORD(this->conn_code1) = HIWORD(conn_code1) | 0xFFFC;
conn_code2 = this->conn_code2;
LOWORD(this->conn_code4) = -1;
conn_code2 |= 0xFFC00u;
this->conn_code2 = conn_code2;
HIWORD(this->conn_code2) = HIWORD(conn_code2) | 0xFFF0;
}
void HDDMSiteTypeConn::readme_pb(HDDMSiteTypeConn *this, std::istream *stream, HDDMDevice *hddmDevice)
{
google::protobuf::Message *v3; // rdx
__int16 v4; // dx
_WORD conn_msg[20]; // [rsp+0h] [rbp-48h] BYREF
char v6; // [rsp+28h] [rbp-20h]
if ( HDDMDeviceDump::useXngMarks )
std::istream::read(stream, HDDMDeviceDump::markBuffer, 4);
HDDMXng::Conn::Conn((HDDMXng::Conn *)conn_msg);
HDDMDevice::readMessage((HDDMDevice *)stream, (std::istream *)conn_msg, v3);
HIWORD(this->conn_code3) = conn_msg[8];
HIWORD(this->conn_code) = conn_msg[10];
v4 = conn_msg[14];
HIWORD(this->conn_code1) = (4 * conn_msg[12]) | HIWORD(this->conn_code1) & 3;
this->conn_code1 = (16 * (v4 & 0x3FFF)) | this->conn_code1 & 0xFFFC000F;
if ( (v6 & 0x10) != 0 )
HIWORD(this->conn_code2) = (16 * conn_msg[16]) | HIWORD(this->conn_code2) & 0xF;
HDDMXng::Conn::~Conn((HDDMXng::Conn *)conn_msg);
}
void __fastcall HDDMSiteTypeConn::writeme_pb(HDDMSiteTypeConn *this, std::ostream *a2)
{
unsigned __int64 v2; // rdx
int conn_code_high; // eax
unsigned __int16 conn_code2_high; // ax
_DWORD conn_msg[10]; // [rsp+0h] [rbp-48h] BYREF
unsigned int v6; // [rsp+28h] [rbp-20h]
if ( HDDMDeviceDump::useXngMarks )
std::ostream::write(a2, "CONN", 4);
HDDMXng::Conn::Conn((HDDMXng::Conn *)conn_msg);
v2 = v6;
conn_msg[4] = HIWORD(this->conn_code3);
conn_code_high = HIWORD(this->conn_code);
v6 |= 0xFu;
conn_msg[5] = conn_code_high;
conn_msg[6] = HIWORD(this->conn_code1) >> 2;
conn_msg[7] = ((unsigned int)this->conn_code1 >> 4) & 0x3FFF;
conn_code2_high = HIWORD(this->conn_code2);
if ( (conn_code2_high & 0xFFF0) != 0xFFF0 )
{
v2 = (unsigned int)v2 | 0x1F;
v6 = v2;
conn_msg[8] = conn_code2_high >> 4;
}
HDDMDevice::writeMessage((HDDMDevice *)a2, (std::ostream *)conn_msg, (const google::protobuf::Message *)v2);
HDDMXng::Conn::~Conn((HDDMXng::Conn *)conn_msg);
}
void __fastcall HDDMSiteTypeConn::print(HDDMSiteTypeConn *this, std::ostream *stream, const std::string *fileName)
{
__int64 conn_code_low; // r14
__int64 v5; // r13
std::ostream *v6; // r14
__int64 v7; // rax
_BYTE *v8; // r13
char v9; // al
std::ostream *v10; // rax
__int64 conn_code_high; // r15
unsigned __int16 v12; // r14
__int64 v13; // r13
__int64 v14; // r13
std::ostream *v15; // r14
__int64 v16; // rax
_BYTE *v17; // r13
char v18; // al
std::ostream *v19; // rax
char conn_code1; // r13
__int64 v21; // r14
__int64 v22; // r15
__int64 v23; // r15
__int64 v24; // r15
__int64 v25; // r14
__int64 v26; // r14
__int64 v27; // r14
std::ostream *v28; // r14
__int64 v29; // rax
_BYTE *v30; // r13
char v31; // al
std::ostream *v32; // rax
__int64 conn_code3_low; // r13
__int64 v34; // rbx
std::ostream *v35; // rbp
__int64 v36; // rax
_BYTE *v37; // rbx
char v38; // al
std::ostream *v39; // rax
__int64 conn_code3_high; // [rsp+8h] [rbp-50h]
unsigned __int16 v41; // [rsp+16h] [rbp-42h]
unsigned __int16 v42; // [rsp+18h] [rbp-40h]
unsigned __int16 v43; // [rsp+1Ch] [rbp-3Ch]
conn_code_low = LOWORD(this->conn_code);
v5 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
std::__ostream_insert<char,std::char_traits<char>>(v5, "SITETYPECONN : ", 15);
v6 = (std::ostream *)std::ostream::_M_insert<unsigned long>(v5, conn_code_low);
v7 = *(_QWORD *)(*(_QWORD *)v6 - 24LL);
v8 = *(_BYTE **)((char *)v6 + v7 + 240);
if ( !v8 )
goto LABEL_18;
if ( v8[56] )
{
v9 = v8[67];
}
else
{
std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)v6 + v7 + 240));
v9 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v8 + 48LL))(v8, 10);
}
v10 = (std::ostream *)std::ostream::put(v6, v9);
std::ostream::flush(v10);
conn_code_high = HIWORD(this->conn_code);
v12 = ((unsigned int)this->conn_code2 >> 10) & 0x3FF;
v13 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
std::__ostream_insert<char,std::char_traits<char>>(v13, " m_bel1 : ", 10);
v14 = std::ostream::_M_insert<unsigned long>(v13, conn_code_high);
std::__ostream_insert<char,std::char_traits<char>>(v14, " m_sitetype : ", 14);
v15 = (std::ostream *)std::ostream::_M_insert<unsigned long>(v14, v12);
v16 = *(_QWORD *)(*(_QWORD *)v15 - 24LL);
v17 = *(_BYTE **)((char *)v15 + v16 + 240);
if ( !v17 )
goto LABEL_18;
if ( v17[56] )
{
v18 = v17[67];
}
else
{
std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)v15 + v16 + 240));
v18 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v17 + 48LL))(v17, 10);
}
v19 = (std::ostream *)std::ostream::put(v15, v18);
std::ostream::flush(v19);
conn_code1 = this->conn_code1;
conn_code3_high = HIWORD(this->conn_code3);
v43 = HIWORD(this->conn_code1) >> 2;
v42 = this->conn_code2 & 0x3FF;
v41 = ((unsigned int)this->conn_code1 >> 4) & 0x3FFF;
v21 = HIWORD(this->conn_code2) >> 4;
v22 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
std::__ostream_insert<char,std::char_traits<char>>(v22, " m_pin1 : ", 10);
v23 = std::ostream::_M_insert<unsigned long>(v22, v41);
std::__ostream_insert<char,std::char_traits<char>>(v23, " m_speedidx : ", 14);
v24 = std::ostream::_M_insert<unsigned long>(v23, (unsigned __int16)v21);
std::__ostream_insert<char,std::char_traits<char>>(v24, " m_bel0 : ", 10);
v25 = std::ostream::_M_insert<unsigned long>(v24, conn_code3_high);
std::__ostream_insert<char,std::char_traits<char>>(v25, " m_wasted1 : ", 13);
v26 = std::ostream::_M_insert<unsigned long>(v25, v42);
std::__ostream_insert<char,std::char_traits<char>>(v26, " m_pin0 : ", 10);
v27 = std::ostream::_M_insert<unsigned long>(v26, v43);
std::__ostream_insert<char,std::char_traits<char>>(v27, " m_deviceid : ", 14);
v28 = (std::ostream *)std::ostream::_M_insert<unsigned long>(v27, conn_code1 & 0xF);
v29 = *(_QWORD *)(*(_QWORD *)v28 - 24LL);
v30 = *(_BYTE **)((char *)v28 + v29 + 240);
if ( !v30 )
goto LABEL_18;
if ( v30[56] )
{
v31 = v30[67];
}
else
{
std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)v28 + v29 + 240));
v31 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v30 + 48LL))(v30, 10);
}
v32 = (std::ostream *)std::ostream::put(v28, v31);
std::ostream::flush(v32);
conn_code3_low = LOWORD(this->conn_code3);
v34 = std::__ostream_insert<char,std::char_traits<char>>(
stream,
*(_QWORD *)fileName,
*(_QWORD *)(*(_QWORD *)fileName - 24LL));
std::__ostream_insert<char,std::char_traits<char>>(v34, "m_netid : ", 10);
v35 = (std::ostream *)std::ostream::_M_insert<unsigned long>(v34, conn_code3_low);
v36 = *(_QWORD *)(*(_QWORD *)v35 - 24LL);
v37 = *(_BYTE **)((char *)v35 + v36 + 240);
if ( !v37 )
LABEL_18:
std::__throw_bad_cast();
if ( v37[56] )
{
v38 = v37[67];
}
else
{
std::ctype<char>::_M_widen_init(*(_QWORD *)((char *)v35 + v36 + 240));
v38 = (*(__int64 (__fastcall **)(_BYTE *, __int64))(*(_QWORD *)v37 + 48LL))(v37, 10);
}
v39 = (std::ostream *)std::ostream::put(v35, v38);
std::ostream::flush(v39);
}