转换
来源:互联网 发布:使命召唤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++;
}
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 转换
- 行列转换/矩阵转换
- NIO的SelectableChannel关闭的一个问题
- 《Windows程序调试(Debugging Windows Programs)》读书笔记(一)
- Hibernate中的JAVA对象有三种状态
- 用千千静听制作一张自动播放的光盘
- 用JFig管理配置文件
- 转换
- 闪字效果代码
- 中文与acsii码相互转换方法
- Java常用包以及String类,函数的调用
- Java中对象的克隆
- MySQL 查询重复出现次数最多的记录
- 2009-07-13
- 乔布斯在斯坦福大学的演讲稿
- 人生若只如初见