9

我正在运行 AT 命令AT+KCELL来获取小区信息,它返回,除其他外,一个PLMN公共陆地和移动网络) - 文档中对此的描述是:

PLMN 标识符(3 个字节),由 MCC(移动国家代码)和 MNC(移动网络代码)组成。

好的,这与 Wikipedia 所说的相符——其中有 MCC 和 MNC。现在我不明白的是如何提取上述 MCC 和 MNC 值?

这是一个例子。我回来了:

32f210

我被告知(尽管我持怀疑态度)这应该会导致:

MNC: 1
MCC: 232

但我一生都无法弄清楚如何从 PLMN 获得该结果,那么我该如何解析呢?

4

2 回答 2

14

好吧,我发现了这一点,并想我会在这里添加一个答案,以防有其他不幸的灵魂必须这样做 - 名为GSM Technical Specification(第 10.2.4 节)的 PDF 包含答案,相关位是:

PLMN 内容:移动国家代码 (MCC) 后跟移动网络代码 (MNC)。编码:根据 TS GSM 04.08 [14]。

  • 如果需要存储少于最大可能数 n,则多余的字节应设置为“FF”。例如,MCC 使用 246,MNC 使用 81,如果这是第一个也是唯一的 PLMN,则内容如下所示: 字节 1-3:'42' 'F6' '18' 字节 4-6:'FF ''FF''FF' 等

所以我的怀疑是错误的!

我需要从左侧读取交换数字,因此前两个字节将是 MCC,因此232fMNC 将是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();
于 2012-04-27T17:15:15.247 回答
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;
}
于 2016-10-28T06:57:29.773 回答