C#版的LOWORD,HIWORD,LOWBYTE,HIGHBYTE解析方法

本文详细介绍了C#中的位操作函数LOWORD、HIWORD、LOWBYTE、HIGHBYTE的用法及应用场景,帮助开发者更好地理解并运用这些函数进行位操作。
public static ushort LOWORD(uint value) 
{
    return (ushort)(value & 0xFFFF);
}
public static ushort HIWORD(uint value) 
{
    return (ushort)(value >> 16);
}
public static byte LOWBYTE(ushort value)
 {
    return (byte)(value & 0xFF);
}
public static byte HIGHBYTE(ushort value) 
{
    return (byte)(value >> 8);
}

请仔细阅读和分析下面函数,保持函数原始逻辑功能不变, 不要遗漏逻辑细节,进行优化后,采用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); }
11-04
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值