📄 高手啊,,帮我将这个c程序改写delphi吧。有难度的。有关pdu转码的问题 delphi - windows sdk-api - csdn社区 community_csdn_net.htm
字号:
<BR> // 7-bit解码 <BR> //
pSrc: 源编码串指针 <BR> // pDst: 目标字符串指针
<BR> // nSrcLength: 源编码串长度 <BR> // 返回:
目标字符串长度 <BR> int gsmDecode7bit(const unsigned
char* pSrc, char* pDst, int
nSrcLength) <BR> { <BR>
int nSrc; //
源字符串的计数值 <BR> int nDst;
// 目标解码串的计数值
<BR> int nByte;
// 当前正在处理的组内字节的序号,范围是0-6
<BR> unsigned char nLeft;
// 上一字节残余的数据 <BR>
<BR> // 计数值初始化
<BR> nSrc = 0; <BR>
nDst = 0; <BR>
<BR> //
组内字节序号和残余数据初始化 <BR> nByte =
0; <BR> nLeft = 0;
<BR> <BR>
// 将源数据每7个字节分为一组,解压缩成8个字节 <BR>
// 循环该处理过程,直至源数据被处理完 <BR>
// 如果分组不到7字节,也能正确处理 <BR>
while(nSrc<nSrcLength) <BR> {
<BR> //
将源字节右边部分与残余数据相加,去掉最高位,得到一个目标解码字节 <BR>
*pDst = ((*pSrc <<
nByte) | nLeft) & 0x7f; <BR>
//
将该字节剩下的左边部分,作为残余数据保存起来 <BR>
nLeft = *pSrc >>
(7-nByte); <BR> <BR>
// 修改目标串的指针和计数值
<BR>
pDst++; <BR>
nDst++; <BR> <BR>
// 修改字节计数值
<BR> nByte++;
<BR> <BR>
// 到了一组的最后一个字节
<BR> if(nByte
== 7) <BR>
{ <BR>
// 额外得到一个目标解码字节
<BR>
*pDst = nLeft; <BR>
<BR>
// 修改目标串的指针和计数值 <BR>
pDst++; <BR>
nDst++; <BR>
<BR>
// 组内字节序号和残余数据初始化
<BR>
nByte = 0; <BR>
nLeft =
0; <BR>
} <BR> <BR>
// 修改源串的指针和计数值
<BR> pSrc++;
<BR>
nSrc++; <BR> } <BR>
<BR> *pDst
= 0; <BR> <BR>
// 返回目标串长度 <BR>
return nDst; <BR> } <BR>
<BR>
需要指出的是,7-bit的字符集与ANSI标准字符集不完全一致,在0x20以下也排布了一些可打印字符,但英文字母、阿拉伯数字和常用符号的位置两者是一样的。用上面介绍的算法收发纯英文短消息,一般情况应该是够用了。如果是法语、德语、西班牙语等,含有
“&aring;”、 “é”这一类字符,则要按上面编码的输出去查表,请参阅GSM 03.38的规定。
<BR> <BR> 8-bit编码其实没有规定什么具体的算法,不需要介绍。
<BR> <BR>
UCS2编码是将每个字符(1-2个字节)按照ISO/IEC10646的规定,转变为16位的Unicode宽字符。在Windows系统中,特别是在2000/XP中,可以简单地调用API
函数实现编码和解码。如果没有系统的支持,比如用单片机控制手机模块收发短消息,只好用查表法解决了。 <BR>
<BR> Windows环境下,用C实现UCS2编码和解码的算法如下: <BR> <BR> //
UCS2编码 <BR> // pSrc: 源字符串指针 <BR>
// pDst: 目标编码串指针 <BR> // nSrcLength:
源字符串长度 <BR> // 返回: 目标编码串长度 <BR> int
gsmEncodeUcs2(const char* pSrc, unsigned
char* pDst, int nSrcLength) <BR> {
<BR> int nDstLength;
// UNICODE宽字符数目
<BR> WCHAR wchar[128];
// UNICODE串缓冲区 <BR>
<BR> //
字符串-->UNICODE串 <BR> nDstLength
= ::MultiByteToWideChar(CP_ACP, 0, pSrc,
nSrcLength, wchar, 128); <BR>
<BR> // 高低字节对调,输出
<BR> for(int i=0;
i<nDstLength; i++) <BR> {
<BR> //
先输出高位字节 <BR>
*pDst++ = wchar[i] >> 8;
<BR> //
后输出低位字节 <BR>
*pDst++ = wchar[i] & 0xff;
<BR> } <BR>
<BR> // 返回目标编码串长度
<BR> return nDstLength *
2; <BR> } <BR>
<BR> // UCS2解码 <BR> // pSrc: 源编码串指针
<BR> // pDst: 目标字符串指针 <BR> //
nSrcLength: 源编码串长度 <BR> // 返回: 目标字符串长度
<BR> int gsmDecodeUcs2(const unsigned char*
pSrc, char* pDst, int nSrcLength) <BR>
{ <BR> int nDstLength;
// UNICODE宽字符数目
<BR> WCHAR wchar[128];
// UNICODE串缓冲区 <BR>
<BR> //
高低字节对调,拼成UNICODE <BR> for(int
i=0; i<nSrcLength/2; i++) <BR>
{ <BR>
// 先高位字节 <BR>
wchar[i] = *pSrc++ <<
8; <BR> <BR>
// 后低位字节
<BR> wchar[i]
|= *pSrc++; <BR> }
<BR> <BR>
// UNICODE串-->字符串 <BR>
nDstLength = ::WideCharToMultiByte(CP_ACP, 0, wchar,
nSrcLength/2, pDst, 160, NULL, NULL);
<BR> <BR>
// 输出字符串加个结束符 <BR>
pDst[nDstLength] = '\0';
<BR> <BR>
// 返回目标字符串长度 <BR>
return nDstLength; <BR> } <BR>
<BR>
用以上编码和解码模块,还不能将短消息字符串编码为PDU串需要的格式,也不能直接将PDU串中的用户信息解码为短消息字符串,因为还差一个在可打印字符串和字节数据之间相互转换的环节。可以循环调用sscanf和sprintf函数实现这种变换。下面提供不用这些函数的算法,它们也适用于单片机、DSP编程环境。
<BR> <BR> // 可打印字符串转换为字节数据 <BR> //
如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B,
0xFD, 0x0E, 0x01} <BR> // pSrc:
源字符串指针 <BR> // pDst: 目标数据指针 <BR> //
nSrcLength: 源字符串长度 <BR> // 返回: 目标数据长度
<BR> int gsmString2Bytes(const char* pSrc,
unsigned char* pDst, int nSrcLength)
<BR> { <BR> for(int i=0;
i<nSrcLength; i+=2) <BR>
{ <BR>
// 输出高4位 <BR>
if(*pSrc>='0' && *pSrc<='9')
<BR> {
<BR>
*pDst = (*pSrc - '0')
<< 4; <BR>
} <BR>
else <BR>
{ <BR>
*pDst = (*pSrc -
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -