如何从PLMN中提取MCC和MNC?

kmp*_*kmp 7 gsm at-command

我正在运行AT命令AT + KCELL以获取小区信息,并返回PLMN(公共陆地和移动网络) - 文档中的描述如下:

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

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

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

32f210
Run Code Online (Sandbox Code Playgroud)

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

MNC: 1
MCC: 232
Run Code Online (Sandbox Code Playgroud)

但我不能为我的生活弄清楚如何从PLMN获得结果,那我该如何解析呢?

kmp*_*kmp 12

好吧,我已经发现了这一点,并认为我会在这里添加一个答案,以防有一些其他不幸的灵魂必须这样做 - PDF称为GSM技术规范(第10.2.4节)包含答案,相关的位是:

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,这样就可以了232f,01然后MNC将丢弃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();
Run Code Online (Sandbox Code Playgroud)

  • 事实上,MCC需要3个半字节,而MNC需要3个半字节(美国运营商需要3位数的MNC).将MCC/MNC保存为数字并不是一个好主意,因为前导零是重要的.所以首先我们必须交换PLMN的半字节,`32f210 => 232f01`,然后我们分配`MCC = 232`和`MNC = 01`(忽略`f`).但是如果我们将拥有具有3位MNC的运营商,那么我们将具有以下内容:`PLMN = 130203 => 312030 => MCC = 312,MNC = 030`. (5认同)