记得之前说过imsi的算法规则,今天来说一下imei、大部分都引自网络。以前一直以为这个东西是随机生成的15位数字,事实上,IMEI遵循GSM Association给定的IMEI格式,校验遵循Luhn算法(模10算法)。
对于大部分APP厂商来说,一般不会耗费成本去对接一个查询IMEI真伪的API,但是让程序员写个算法校验一下还是很简单的,如此逆过来随机和推算即可生成符合简单校验的IMEI。所以通过规则来生成符合条件的IMEI还是很有必要的
自己随机生成的话主要是后7位(6位随机000000-999999,加上一位计算出来的校验码),至于前面,不太建议随机,平时搜集一点主流机型的IMEI,把前面固定就好了
.版本 2
.子程序 Luhn_校验, 逻辑型, 公开, 模10校验
.参数 数字文本, 文本型
.局部变量 len, 整数型
.局部变量 i, 整数型
.局部变量 奇数位和, 整数型
.局部变量 偶数位和, 整数型
.局部变量 int, 整数型
len = 取文本长度 (数字文本)
奇数位和 = 0
偶数位和 = 0
.计次循环首 (len, i)
int = 到整数 (取文本中间 (数字文本, len - i + 1, 1))
.如果 (i % 2 = 0)
int = int × 2
偶数位和 = 偶数位和 + int \ 10 + int % 10
.否则
奇数位和 = 奇数位和 + int
.如果结束
.计次循环尾 ()
返回 ((偶数位和 + 奇数位和) % 10 = 0)
.子程序 Luhn_计算IMEI校验码, 整数型, 公开, 传入14位
.参数 数字文本, 文本型
.局部变量 len, 整数型
.局部变量 i, 整数型
.局部变量 奇数位和, 整数型
.局部变量 偶数位和, 整数型
.局部变量 int, 整数型
.局部变量 校验和, 整数型
.局部变量 余数, 整数型
len = 取文本长度 (数字文本)
奇数位和 = 0
偶数位和 = 0
.计次循环首 (len, i)
int = 到整数 (取文本中间 (数字文本, i, 1))
.如果 (i % 2 = 0)
int = int × 2
偶数位和 = 偶数位和 + int \ 10 + int % 10
.否则
奇数位和 = 奇数位和 + int
.如果结束
.计次循环尾 ()
校验和 = 偶数位和 + 奇数位和
余数 = 校验和 % 10
返回 (选择 (余数 = 0, 0, 到整数 ((校验和 \ 10 + 1) × 10 - 校验和)))
.子程序 IMEI_随机, 文本型, 公开
.参数 ReportingBodyIdentifier, 文本型, 可空, 分配机构标识 TAC码前两位 01为美国CTIA,35为英国BABT,86为中国TAF
.参数 TAC4, 文本型, 可空, TAC后四位
.参数 FAC, 文本型, 可空, Final Assembly Code 最终装配地代码
.参数 SNR, 文本型, 可空, 000000-999999 Serial Number,序列号,由第9位开始的6位数字组成,区分每部手机的生产序列号。
.局部变量 IMEI, 文本型
SNR = 到文本 (取随机数_asm_Ex (0, 999999))
IMEI = ReportingBodyIdentifier + TAC4 + FAC + 取文本左边 (“000000”, 6 - 取文本长度 (SNR)) + SNR
返回 (IMEI + 到文本 (Luhn_计算IMEI校验码 (IMEI)))
.子程序 取随机数_asm_Ex, 整数型, 公开, 真 随机
.参数 最小, 整数型
.参数 最大, 整数型
.如果真 (最大 < 最小)
返回 (最大 - 1)
.如果真结束
置入代码 ({ 81, 82, 15, 49, 185, 23, 0, 0, 0, 247, 225, 131, 192, 7, 139, 77, 12, 43, 77, 8, 65, 51, 210, 247, 241, 3, 85, 8, 139, 194, 90, 89, 201, 194, 8, 0 })
返回 (0)