如何从 PLMN 中提取 MCC 和 MNC?
Posted
技术标签:
【中文标题】如何从 PLMN 中提取 MCC 和 MNC?【英文标题】:How can I extract the MCC and MNC from a PLMN? 【发布时间】:2012-05-07 21:24:01 【问题描述】:我正在运行 AT 命令 AT+KCELL 来获取单元信息,它会返回 PLMN
(Public Land and Mobile Network) - 文档中对此的描述是:
PLMN 标识符(3 个字节),由 MCC(移动国家代码)和 MNC 组成 (移动网络代码)。
好的,这与 Wikipedia 所说的相符——其中有 MCC 和 MNC。现在我不明白的是如何提取上述 MCC 和 MNC 值?
这是一个例子。我回来了:
32f210
我被告知(尽管我持怀疑态度)这应该会导致:
MNC: 1
MCC: 232
但我一生都无法弄清楚如何从 PLMN 获得该结果,那么我该如何解析呢?
【问题讨论】:
如果你在 unix 上,你可以试试 cut 命令 我在 Windows 机器上,但我会阅读 cut 命令,谢谢。 【参考方案1】:好吧,我发现了这一点,并想我会在这里添加一个答案,以防有其他不幸的灵魂必须这样做 - 名为GSM Technical Specification(第 10.2.4 节)的 PDF 包含答案,相关的位是:
PLMN 内容:移动国家代码 (MCC) 后跟移动网络代码 (MNC)。编码:根据 TS GSM 04.08 [14]。
如果存储 对于小于最大可能数 n 是必需的,超出 字节应设置为'FF'。例如,将 246 用于 MCC,将 81 对于 MNC,如果这是第一个也是唯一的 PLMN,则内容为 如下: 字节 1-3:'42' 'F6' '18' 字节 4-6:'FF' 'FF' 'FF' 等
所以我的怀疑是错误的!
我需要从左侧读取交换数字,因此前两个字节将是 MCC,因此将是 232f
而 MNC 将是 01
然后我只是丢弃 f 并且我有 232 和 1 !很高兴一个被排序。
例如,在 c# 中你可以这样做:
string plmn = "whatever the plmn is";
string mcc = new string(plmn.Substring(0, 2).Reverse().ToArray())
+ new string(plmn.Substring(2, 2).Reverse().ToArray())
.Replace('f', ' ')
.Trim();
string mnc = new string(plmn.Substring(4, 2).Reverse().ToArray())
.Replace('f', ' ')
.Trim();
【讨论】:
实际上 MCC 需要 3 个 nibbles,而 MNC 需要 3 个 nibbles(美国运营商有 3 位数的 MNC)。将 MCC/MNC 保存为数字并不是一个好主意,因为前导零很重要。所以首先我们必须交换 PLMN 的半字节,32f210 => 232f01
,然后我们分配 MCC=232
和 MNC=01
(f
被忽略)。但是,如果我们的运营商拥有 3 位 MNC,那么我们将拥有以下内容:PLMN=130203 => 312030 => MCC=312, MNC=030
.【参考方案2】:
这是一个按位运算的java答案:
public static String mcc(byte[] plmnId)
if (plmnId == null || plmnId.length != 3)
throw new IllegalArgumentException(String.format("Wrong plmnid %s", Arrays.toString(plmnId)));
int a1 = plmnId[0] & 0x0F;
int a2 = (plmnId[0] & 0xF0) >> 4;
int a3 = plmnId[1] & 0x0F;
return "" + a1 + a2 + a3;
public static String mnc(byte[] plmnId)
if (plmnId == null || plmnId.length != 3)
throw new IllegalArgumentException(String.format("Wrong plmnid %s", Arrays.toString(plmnId)));
int a1 = plmnId[2] & 0x0F;
int a2 = (plmnId[2] & 0xF0) >> 4;
int a3 = (plmnId[1] & 0xF0) >> 4;
if (a3 == 15)
return "" + a1 + a2;
else
return "" + a1 + a2 + a3;
【讨论】:
以上是关于如何从 PLMN 中提取 MCC 和 MNC?的主要内容,如果未能解决你的问题,请参考以下文章