如何从 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=232MNC=01f 被忽略)。但是,如果我们的运营商拥有 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?的主要内容,如果未能解决你的问题,请参考以下文章

LTE小区搜索过程及SCH/BCH设计

PLMN(公共陆地移动网络)

PLMN选择,RPLMNEPLMNUPLMNOPLMNVPLMNAPLMNFPLMN的概念

你如何在Android中获得手机的MCC和MNC?

移动运营商唯一标识符

如何在不使用位置信息的情况下将 MCC + MNC 映射到 iOS Objective-C 中的用户电话国家代码?