转换

来源:互联网 发布:使命召唤12i5优化补丁 编辑:程序博客网 时间:2024/06/09 14:30

// 把byte型数据转换为无符号long型数据
private static long byteToul(byte b) {
   return b >0 ?b : ( b & 0x7F + 128);
}

// 把byte类型的数据转换成十六进制ASCII字符表示
private static String byteToHEX(byte in) {
   char[] DigitStr = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
        'A', 'B', 'C', 'D', 'E', 'F' };
   char[] out = new char[2];
   out[0] = DigitStr[(in >> 4) & 0x0F]; //取高4位
   out[1] = DigitStr[in & 0x0F];        //取低4位
   String s = new String(out);
   return s;
}

// 将long型数组按顺序拆成byte型数组,长度为len
private void Encode(byte[] output, long[] input, int len) {
   int i, j;
   for (i = 0, j = 0; j < len; i++, j += 4) {
    output[j] = (byte) (input[i] & 0xffL);
    output[j + 1] = (byte) ((input[i] >>> 8) & 0xffL);
    output[j + 2] = (byte) ((input[i] >>> 16) & 0xffL);
    output[j + 3] = (byte) ((input[i] >>> 24) & 0xffL);
   }
}

// 将byte型数组按顺序合成long型数组,长度为len
private void Decode(long[] output, byte[] input, int len) {
   int i, j;
   for (i = 0, j = 0; j < len; i++, j += 4)
    output[i] = byteToul(input[j])
      | (byteToul(input[j + 1]) << 8)
      | (byteToul(input[j + 2]) << 16)
      | (byteToul(input[j + 3]) << 24);
   return;
}

}

 

 

一个数据包,其串头为一个字符,字符值为7EH(16进制)'~',其后紧跟一字符‘E’,然后是数据串,串尾也为字符值为7EH的一个字符:
即 ~Exxxxxx...~ 如何处理这些数据?
我们仍以串口调试助手源程序及其详细编程过程之一 中的OnComm()处理为例:
void CSCommTestDlg::OnComm() 
{
// TODO: Add your control notification handler code here
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
CString strtemp;
if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
{ ////////以下你可以根据自己的通信协议加入处理代码
variant_inp=m_ctrlComm.GetInput(); //读缓冲区
safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
len=safearray_inp.GetOneDimSize(); //得到有效数据长度
for(k=0;k<len;k++)
safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
for(k=0;k<len;k++) //将数组转换为Cstring型变量
{
BYTE bt=*(char*)(rxdata+k); //字符型
strtemp.Format("%c",bt); //将字符送入临时变量strtemp存放

m_strRXData+=strtemp; //加入接收编辑框对应字符串,在这儿,编辑框不是必须的,可做相应处理
char ch=(char)bt;
if(ch=='E')

//在此处设置一个可以接收数据的全局标志,说明接收到数据前的‘E’标志了,下一步可以读数据了,同时将m_strRXData清空
        flag=2;
         m_strRXData.Empty(); //下一次接收的便为有用的数据
}
if(ch==0x7e) 
{
      flag=1; //下面可以提取数据了
}
if(flag==1) //标志为1,
{
     ...//提取数据
        flag=0; //提取完后,置标志为0
}

}
}
//UpdateData(FALSE); //更新编辑框内容
}

 

/*------------------------------------------------------------  
   
      函数名   :   TransData(CString   InStr,   PUCHAR   OutStr)  
   
      功     能   :   将字符串转换成十六进制数据  
   
      参     数   :   CString   InStr   [in]   输入字符串  
   
      PUCHAR   OutStr   [out]   输出转换后数据的指针  
   
      返回值   :   BOOL,正确返回TRUE,错误返回FALSE  
   
------------------------------------------------------------*/  
BOOL   TransData(CString   InStr,   PUCHAR   OutStr)  
{  
UINT                 i   =   0,   j   =   0;  
UINT       len   =   0;  
UCHAR               Str[KEY_LEN   *   2];  
   
len   =   InStr.GetLength();  
   
if   ((len   %   2)   !=   0)  
{  
MessageBox("请按要求输入!",   "错误",   MB_OK   |   MB_ICONERROR);  
return   FALSE;  
}  
   
memset(OutStr,   0,   sizeof(UCHAR[KEY_LEN]));  
memset(Str,   0,   sizeof(UCHAR[KEY_LEN   *   2]));  
strcpy((char*)(Str),   InStr.GetBuffer(0));  
InStr.ReleaseBuffer();  
   
for(i   =   0;   i   <   len;   i++)  
{  
if   ((Str[i]   >   47)   &&   (Str[i]   <   58))  
{  
Str[i]   -=   48;  
}  
else   if   ((Str[i]   >   64)   &&   (Str[i]   <   71))  
{  
Str[i]   -=   55;  
}  
else   if   ((Str[i]   >   96)   &&   (Str[i]   <   103))  
{  
Str[i]   -=   87;  
}  
else  
{  
MessageBox("数据格式错误!",   "错误",   MB_OK   |   MB_ICONERROR);  
return   FALSE;  
}  
}  
   
i   =   0;  
while(i   <   len)  
{   //   转换  
Str[j]   =   Str[i]   *   16   +   Str[i   +   1];  
i   +=   2;  
j++;  
}