You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 10:12:04