- 论坛徽章:
- 0
|
串口工作需要,编写了一些小程序测试。以后慢慢添加我所编写的小程序。
字符串跟字符数组真是非常有意思的东东。老是搞混,经过这段时间的c编程才发现c真的是无所不能哇呵呵,同时也深深的感觉到了自己基础不够扎实。
字符数组的名称是个局部常量,不能作为子函数调用返回。因为离开了当前函数,它的作用就消失了,我编程时老想将这个字符数组返回,然后提示返回局部常量的错误,后来意识到这是个非常明显的错误,其实根本没有必要返回一个字符数组。
而字符串不同,指针变量一直存在于内存当中,直到程序销毁。
char
a='a'; //字符
char
*b="abc"; //字符串
字符串的初始化方式
char
b[4]="sds";
也可以
char b[4] =
{'s','d','s','\0'},如果后面加了一个\0符号,表示这是一个字符串。否则看成是字符数组。
char
c[15]; //字符数组,最多可以容纳15个字符,如果他要容纳一个字符串只能装14个有效字符和一个结束符
1
将16进制格式的字符串"30,00,01,41,11,11,11,11,11,11,11,11,1f,ae,3a"中的30,00,等16进制数提取出来并保存在check数组中,并且对数据部分进行crc校验。
#include
#include
[color="#800000"]//请求侦格式
30 00 01 41 11 11 11 11 11 11 11 11 1F
AE 3A
[color="#800000"]//数据侦格式
30 01 00 44 xx xx xx xx xx xx xx xx xx
xx 3A
[color="#800000"]//应答侦格式
30 01 00 42 11 11 11 11 11 11 11 11 1F
AE 3A
unsigned
int CRC16(unsigned char *data,int length);
int
main()
{
unsigned
char *p;//对应侦的每一个字节
char
a[74] = "30,00,01,41,11,11,11,11,11,11,11,11,1f,ae,3a";
printf("the
length of a is %d\n",strlen(a));
char
s[]=",";
unsigned
char check[15];
unsigned
char data[8];
unsigned
int i,crcvalue,lResult;
printf("the
string %s\n",a);
p
= strtok(a,s);//按逗号截断
lResult
= strtol(p,'\0',16);//再转换成16进制
check[0]
= lResult;
for(i=1;(i
{
lResult
= strtol(p,'\0',16);
check
= lResult;
}
for(i=0;i
{printf("check[%d]
is %x\n",i,check);}
for(i=0;i
{ data
= check[i+4];}
crcvalue
= CRC16(data,8);
printf("crcvalue
is %x\n",crcvalue);
}
unsigned
int CRC16(unsigned char *data,int length)
{
unsigned
int crc;
unsigned
int s;
crc
= 0x00;
while(length--)
{
crc
^=*data;
for(s=0;s
{
if(crc
& 0x01)
{crc=(crc>>1)^0x1021;}
else {crc=crc>>1;}
}
data++;
}
return
crc;
[color="#800000"]}
2
将float或double定义的浮点数转换为16进制。浮点数在内存中以16进制的格式保存。假设float
x =11.2324;那么这个浮点数则存为8e432d9a的形式。
int
isLittleEndian()
{
int
x = 1;
if
(*(char *)&x == 1) {
printf("little-endian\n");
return
TRUE;
}
else
{
printf("big-endian\n");
return
FALSE;
}
[color="#800000"]}
char
*float2HexStr(double f)
{
unsigned
char *pf = (unsigned char *)&f;
//这条语句表示获得浮点数在内存中存储的首地址,如果是float类型,则从首地址开始连续4个字节表示这个浮点数的十六进制。如果是double类型,则从首地址开始连续的8个字节表示这个浮点数的十六进制。
unsigned
char data[24];
int
i;
if
(sizeof(f)>sizeof(double))
return
NULL;
if
(isLittleEndian())
{
for(i=0;i
{printf("pf%d
is 0x%02x\n",i,pf);} 分别打印出这些十六进制的内容。
[color="#800000"] sprintf(data,"%02x,%02x,%02x,%02x,%02x,%02x,%02x,%02x",pf[0],pf[1],pf[2],pf[3],pf[4],pf[5],pf[6],pf[7]);//这里转换成字符串了
printf("data
is %s length is %d\n",data,strlen(data));
[color="#800000"]}
int
main() {
double
f1 = 1009090.1178; 或者float
= 1009090.1178,则自己根据代码修改。
float2HexStr(f1);
return
0;
[color="#800000"]}
字符串转16进制
3
将16进制的字符串转换成double类型的16进制值
#include
#include
int
main()
{
char
*buff = "1748503c84cb2e41";
int
i;
//char
*p;//采用这种形式,输出结果不对。为什么????
char
p[16];
char
temp[8];
for(i=0;i
{
sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
temp
= strtol(p,'\0',16);
}
double
* pfValue=(double*)&temp[0]; //[color="#ff0000"]获得[color="#ff0000"]temp[color="#ff0000"]的首地址,强制转换为一个[color="#ff0000"]double[color="#ff0000"]类型
printf("value
is %f\n",*pfValue);
[color="#800000"]}
4
将16进制的字符串转换成float类型的16进制值。有两种方法,一种也是同上的类型强制转换,另外就是采用union共同体
[color="#000000"]//方法1
int
main()
{
int
i;
//char
*p; 采用*p与p[16]的形式都可以
char
p[16];
char
*buff = "48e13641";
char
temp[4];
for(i=0;i
{
sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
temp
= strtol(p,'\0',16);
}
float
* pfValue=(float*)&temp[0]; //获得temp的首地址,强制转换为一个double类型
printf("value
is %f\n",*pfValue);
[color="#800000"]}
[color="#000000"]方法2
#include
#include
[color="#800000"]//方法1
以共同体union的
int
main()
{
union
{
unsigned
char temp[4];
float
value;
}a;
int
i;
char
*buff = "48e13641";
//unsigned
char *p;
char
p[16];
for(i=0;i
{
sprintf(p,"%c%c",buff[2*i],buff[2*i+1]);
a.temp
= strtol(p,'\0',16);
}
printf("float
value is %f\n",a.value);
[color="#800000"]}
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93598/showart_2007076.html |
|