如何在C++(C++11前)基于MCC/MNC按3GPP标准构造非顺序半字节的十六进制字节
实现符合3GPP标准的ECGI字段编码(C++98/03版本)
没问题,我来帮你搞定这个符合3GPP规范的编码逻辑,用C++11之前的标准就能实现,完全依赖原生标准库~
先把编码规则理清楚(对应你提到的User-Location-Info的ECGI字段格式):
输入是固定6位的std::string,由3位MCC(移动国家代码) + **3位MNC(移动网络代码)**组成(MNC不足3位时会在前补0),要转换成3个十六进制字节,转换逻辑如下:
- 第1个字节:MCC的第2位数字(占高4位) + MCC的第1位数字(占低4位)
- 第2个字节:MNC的第3位数字(占高4位) + MCC的第3位数字(占低4位)
- 第3个字节:MNC的第2位数字(占高4位) + MNC的第1位数字(占低4位)
拿你给的例子"514328"来说:
- MCC是
"514",MNC是"328" - 第1字节:
1 << 4 | 5→ 0x15(二进制00010101,十进制15) - 第2字节:
8 << 4 | 4→ 0x84(二进制10000100,十进制84) - 第3字节:
2 << 4 | 3→ 0x23(二进制00100011,十进制23)
下面是完整的C++98/03实现代码:
#include <string> #include <vector> // 输入6位MCC+MNC字符串,输出3个编码后的字节 std::vector<unsigned char> encodeECGI(const std::string& mcc_mnc) { std::vector<unsigned char> result; // 先做输入合法性校验 if (mcc_mnc.size() != 6) { return result; } // 将字符串字符转换为对应数字(利用ASCII码连续性,'0'-'9'是连续的) int mcc1 = mcc_mnc[0] - '0'; int mcc2 = mcc_mnc[1] - '0'; int mcc3 = mcc_mnc[2] - '0'; int mnc1 = mcc_mnc[3] - '0'; int mnc2 = mcc_mnc[4] - '0'; int mnc3 = mcc_mnc[5] - '0'; // 按规则构造每个字节,用位运算拼接高低4位 unsigned char byte1 = (static_cast<unsigned char>(mcc2) << 4) | mcc1; unsigned char byte2 = (static_cast<unsigned char>(mnc3) << 4) | mcc3; unsigned char byte3 = (static_cast<unsigned char>(mnc2) << 4) | mnc1; result.push_back(byte1); result.push_back(byte2); result.push_back(byte3); return result; } // 测试示例 #include <iostream> int main() { std::string mcc_mnc = "514328"; std::vector<unsigned char> ecgi_bytes = encodeECGI(mcc_mnc); // 输出每个字节的二进制、十进制(C++98没有原生二进制输出,手动拼接) for (unsigned char b : ecgi_bytes) { std::string bin_str; for (int i = 7; i >= 0; --i) { bin_str += (b & (1 << i)) ? '1' : '0'; } std::cout << bin_str << " (" << static_cast<int>(b) << ") "; } // 输出结果:00010101 (15) 10000100 (84) 00100011 (23) std::cout << std::endl; return 0; }
代码说明
- 输入校验:确保传入的字符串是标准的6位格式,避免非法输入导致错误;
- 字符转数字:利用ASCII码中数字字符的连续性,直接减去
'0'就能得到对应整数; - 位运算拼接:左移4位让数字占据字节的高4位,再通过按位或合并低4位,完美符合3GPP的编码要求;
- 二进制输出:C++98没有原生的二进制输出函数,所以手动实现了二进制字符串的拼接,如果你只需要十六进制或十进制,直接用
std::hex或std::dec即可。
内容的提问来源于stack exchange,提问作者eeijlar
相关产品推荐
相关产品推荐

