📄 cmsdata.lst
字号:
245 1 *pDst = '\0';
246 1
247 1 // 返回目标串长度
248 1 return nDst;
249 1 }
250 // 可打印字符串转换为字节数据
251 // 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
252 // pSrc: 源字符串指针
253 // pDst: 目标数据指针
254 // nSrcLength: 源字符串长度
255 // 返回: 目标数据长度
256 int gprsString2Bytes(const char* pSrc, unsigned char* pDst, int nSrcLength)
257 {
258 1 int i;
259 1 for(i=0; i<nSrcLength; i+=2)
260 1 {
261 2 // 输出高4位
262 2 if(*pSrc>='0' && *pSrc<='9')
263 2 {
264 3 *pDst = (*pSrc - '0') << 4;
265 3 }
266 2 else
267 2 {
268 3 *pDst = (*pSrc - 'A' + 10) << 4;
269 3 }
270 2
271 2 pSrc++;
272 2
273 2 // 输出低4位
274 2 if(*pSrc>='0' && *pSrc<='9')
275 2 {
276 3 *pDst |= *pSrc - '0';
277 3 }
278 2 else
279 2 {
280 3 *pDst |= *pSrc - 'A' + 10;
281 3 }
282 2
283 2 pSrc++;
284 2 pDst++;
285 2 }
286 1
287 1 // 返回目标数据长度
288 1 return nSrcLength / 2;
289 1 }
290 // 字节数据转换为可打印字符串
291 // 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01"
292 // pSrc: 源数据指针
293 // pDst: 目标字符串指针
294 // nSrcLength: 源数据长度
295 // 返回: 目标字符串长度
296 int gprsBytes2String(const unsigned char* pSrc, char* pDst, int nSrcLength)
297 {
298 1 const char tab[]="0123456789ABCDEF"; // 0x0-0xf的字符查找表
299 1 int i;
300 1
301 1 for(i=0; i<nSrcLength; i++)
302 1 {
303 2 *pDst++ = tab[*pSrc >> 4]; // 输出低4位
CX51 COMPILER V7.20 CMSDATA 09/22/2006 14:21:06 PAGE 6
304 2 *pDst++ = tab[*pSrc & 0x0f]; // 输出高4位
305 2 pSrc++;
306 2 }
307 1
308 1 // 输出字符串加个结束符
309 1 *pDst = '\0';
310 1
311 1 // 返回目标字符串长度
312 1 return nSrcLength * 2;
313 1 }
314
315 // 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
316 // 如:"8613851872468" --> "683158812764F8"
317 // pSrc: 源字符串指针
318 // pDst: 目标字符串指针
319 // nSrcLength: 源字符串长度
320 // 返回: 目标字符串长度
321 int gprsInvertNumbers(const char* pSrc, char* pDst, int nSrcLength)
322 {
323 1 int nDstLength; // 目标字符串长度
324 1 char ch; // 用于保存一个字符
325 1 int i;
326 1
327 1 // 复制串长度
328 1 nDstLength = nSrcLength;
329 1
330 1 // 两两颠倒
331 1 for(i=0; i<nSrcLength;i+=2)
332 1 {
333 2 ch = *pSrc++; // 保存先出现的字符
334 2 *pDst++ = *pSrc++; // 复制后出现的字符
335 2 *pDst++ = ch; // 复制先出现的字符
336 2 }
337 1
338 1 // 源串长度是奇数吗?
339 1 if(nSrcLength & 1)
340 1 {
341 2 *(pDst-2) = 'F'; // 补'F'
342 2 nDstLength++; // 目标串长度加1
343 2 }
344 1
345 1 // 输出字符串加个结束符
346 1 *pDst = '\0';
347 1
348 1 // 返回目标字符串长度
349 1 return nDstLength;
350 1 }
351 // 两两颠倒的字符串转换为正常顺序的字符串
352 // 如:"683158812764F8" --> "8613851872468"
353 // pSrc: 源字符串指针
354 // pDst: 目标字符串指针
355 // nSrcLength: 源字符串长度
356 // 返回: 目标字符串长度
357 int gprsSerializeNumbers(const char* pSrc, char* pDst, int nSrcLength)
358 {
359 1 int nDstLength; // 目标字符串长度
360 1 char ch; // 用于保存一个字符
361 1 int i;
362 1
363 1 // 复制串长度
364 1 nDstLength = nSrcLength;
365 1
CX51 COMPILER V7.20 CMSDATA 09/22/2006 14:21:06 PAGE 7
366 1 // 两两颠倒
367 1 for(i=0; i<nSrcLength;i+=2)
368 1 {
369 2 ch = *pSrc++; // 保存先出现的字符
370 2 *pDst++ = *pSrc++; // 复制后出现的字符
371 2 *pDst++ = ch; // 复制先出现的字符
372 2 }
373 1
374 1 // 最后的字符是'F'吗?
375 1 if(*(pDst-1) == 'F')
376 1 {
377 2 pDst--;
378 2 nDstLength--; // 目标字符串长度减1
379 2 }
380 1
381 1 // 输出字符串加个结束符
382 1 *pDst = '\0';
383 1
384 1 // 返回目标字符串长度
385 1 return nDstLength;
386 1 }
387
388 int gprsEncodePdu(const SM_PARAM* pSrc, char* pDst)
389 {
390 1 int nLength; // 内部用的串长度
391 1 int nDstLength; // 目标PDU串长度
392 1 unsigned char buf[256]; // 内部用的缓冲区
393 1
394 1 // SMSC地址信息段
395 1 nLength = strlen(pSrc->SCA); // SMSC地址字符串的长度
396 1 buf[0] = (char)((nLength & 1) == 0 ? nLength : nLength + 1) / 2 + 1; // SMSC地址信息长度
397 1 buf[1] = 0x91; // 固定: 用国际格式号码
398 1 nDstLength = gprsBytes2String(buf, pDst, 2); // 转换2个字节到目标PDU串
399 1 nDstLength += gprsInvertNumbers(pSrc->SCA, &pDst[nDstLength], nLength); // 转换SMSC号码到目标PDU串
400 1
401 1 // TPDU段基本参数、目标地址等
402 1 nLength = strlen(pSrc->TPA); // TP-DA地址字符串的长度
403 1 buf[0] = 0x11; // 是发送短信(TP-MTI=01),TP-VP用相对格式(TP-VPF=10)
404 1 buf[1] = 0; // TP-MR=0
405 1 buf[2] = (char)nLength; // 目标地址数字个数(TP-DA地址字符串真实长度)
406 1 buf[3] = 0x91; // 固定: 用国际格式号码
407 1 nDstLength += gprsBytes2String(buf, &pDst[nDstLength], 4); // 转换4个字节到目标PDU串
408 1 nDstLength += gprsInvertNumbers(pSrc->TPA, &pDst[nDstLength], nLength); // 转换TP-DA到目标PDU串
409 1
410 1 // TPDU段协议标识、编码方式、用户信息等
411 1 nLength = strlen(pSrc->TP_UD); // 用户信息字符串的长度
412 1 buf[0] = pSrc->TP_PID; // 协议标识(TP-PID)
413 1 buf[1] = pSrc->TP_DCS; // 用户信息编码方式(TP-DCS)
414 1 buf[2] = 0; // 有效期(TP-VP)为5分钟
415 1
416 1 // 7-bit编码方式
417 1 buf[3] = nLength; // 编码前长度
418 1 nLength = gprsEncode7bit(pSrc->TP_UD, &buf[4], nLength+1) + 4; // 转换TP-DA到目标PDU串
419 1
420 1
421 1 nDstLength += gprsBytes2String(buf, &pDst[nDstLength], nLength); // 转换该段数据到目标PDU串
422 1
423 1 // 返回目标字符串长度
424 1 return nDstLength;
425 1 }
426
427 // PDU解码,用于接收、阅读短消息
CX51 COMPILER V7.20 CMSDATA 09/22/2006 14:21:06 PAGE 8
428 // pSrc: 源PDU串指针
429 // pDst: 目标PDU参数指针
430 // 返回: 用户信息串长度
431 int gprsDecodePdu(const char* pSrc, SM_PARAM* pDst)
432 {
433 1 int nDstLength; // 目标PDU串长度
434 1 unsigned char tmp; // 内部用的临时字节变量
435 1 unsigned char buf[256]; // 内部用的缓冲区
436 1
437 1 // SMSC地址信息段
438 1 gprsString2Bytes(pSrc, &tmp, 2); // 取长度
439 1 tmp = (tmp - 1) * 2; // SMSC号码串长度
440 1 pSrc += 4; // 指针后移,忽略了SMSC地址格式
441 1 gprsSerializeNumbers(pSrc, pDst->SCA, tmp); // 转换SMSC号码到目标PDU串
442 1 pSrc += tmp; // 指针后移
443 1
444 1 // TPDU段基本参数、回复地址等
445 1 gprsString2Bytes(pSrc, &tmp, 2); // 取基本参数
446 1 pSrc += 2; // 指针后移
447 1 // if(tmp & 0x80)
448 1 {
449 2 // 包含回复地址,取回复地址信息
450 2 gprsString2Bytes(pSrc, &tmp, 2); // 取长度
451 2 if(tmp & 1) tmp += 1; // 调整奇偶性
452 2 pSrc += 4; // 指针后移,忽略了回复地址(TP-RA)格式
453 2 gprsSerializeNumbers(pSrc, pDst->TPA, tmp); // 取TP-RA号码
454 2 pSrc += tmp; // 指针后移
455 2 }
456 1
457 1 // TPDU段协议标识、编码方式、用户信息等
458 1 gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_PID, 2); // 取协议标识(TP-PID)
459 1 pSrc += 2; // 指针后移
460 1 gprsString2Bytes(pSrc, (unsigned char*)&pDst->TP_DCS, 2); // 取编码方式(TP-DCS)
461 1 pSrc += 2; // 指针后移
462 1 gprsSerializeNumbers(pSrc, pDst->TP_SCTS, 14); // 服务时间戳字符串(TP_SCTS)
463 1 pSrc += 14; // 指针后移
464 1 gprsString2Bytes(pSrc, &tmp, 2); // 用户信息长度(TP-UDL)
465 1 pSrc += 2; // 指针后移
466 1
467 1 // 7-bit解码
468 1 nDstLength = gprsString2Bytes(pSrc, buf, tmp & 7 ? (int)tmp * 7 / 4 + 2 : (int)tmp * 7 / 4); // 格式转换
469 1 gprsDecode7bit(buf, pDst->TP_UD, nDstLength); // 转换到TP-DU
470 1 nDstLength = tmp;
471 1
472 1
473 1 // 返回目标字符串长度
474 1 return nDstLength;
475 1 }
476
477
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 3302 ----
CONSTANT SIZE = 147 ----
XDATA SIZE = ---- 613
PDATA SIZE = ---- ----
DATA SIZE = ---- ----
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
EDATA SIZE = ---- ----
HDATA SIZE = ---- ----
CX51 COMPILER V7.20 CMSDATA 09/22/2006 14:21:06 PAGE 9
XDATA CONST SIZE = ---- ----
FAR CONST SIZE = ---- ----
END OF MODULE INFORMATION.
CX51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -