如何从PLMN中提取MCC和MNC?

时间:2012-04-27 05:45:44

标签: gsm at-command

我正在运行AT命令AT+KCELL来获取单元格信息,然后返回PLMNPublic Land and Mobile Network) - 文档中的描述如下:< / p>

  

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

好的,这与维基百科所说的相符 - 有MCC和MNC。现在我不明白的是如何提取上述MCC和MNC值?

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

32f210

我被告知(虽然我持怀疑态度),这应该导致:

MNC: 1
MCC: 232

但我不能为我的生活找出如何从PLMN获得结果,那么我该如何解析呢?

2 个答案:

答案 0 :(得分:12)

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

  

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和I有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();

答案 1 :(得分:0)

这是一个带有按位运算的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;
}