1.文件的上传与下载:
上传:
//FileUpload1是aspx页面的一个FileUpload控件
UpDownFile.UpDownFile up = new UpDownFile.UpDownFile();
up.Up(ConvertStreamToByteBuffer(FileUpload1.PostedFile.InputStream),
FileUpload1.PostedFile.FileName.Substring(FileUpload1.PostedFile.FileName.LastIndexOf("\") + 1));
下载:
UpDownFile.UpDownFile down = new UpDownFile.UpDownFile();
byte file = down.Down(Request.QueryString"filename".ToString()); //filename是要下载的文件路径,可自行以其它方式获取文件路径
Response.BinaryWrite(file);
以下是将文件流转换成文件字节的函数(因为Stream类型的是不能直接通过WebService传输):
protected byte] ConvertStreamToByteBuffer(Stream s)
{
BinaryReader br = new BinaryReader(stream);
byte fileBytes = br.ReadBytes((int)stream.Length);
return fileBytes;
}
2.atoi与atof等的使用。
CString strData = _T("");
int nData = atoi(strData);
double dData = atof(strData);
3.CString的使用,其中Find(),Mid(),Left()尤为重要,明白它们的返回值,请仔细看看。
Find()返回为整型,Mid()与Left()返回为字符串,
Left()是取字符串中第几个位置的左面字符串。
Mid(+1)是取字符串中第几个位置(包括这个位置)的右面字符串。
strSendString.ReverseFind();从后面开始查找
4.指针与数组的使用。
总结下指针和数组的区别:
以字符数组为例简单说明下数组与指针之间的区别:
1). char a[3];
2). char *b=new char[size];
3). const char *c;
4). string d;
相同点:a,b,c,d都表示的是地址;
不同点:
(1). a3]只能放三个字符数据,*b则不受大小限制,可以存放许多字符变量,大小根据size的大小确定;
(2). b在定义时一定要分配内存空间,否则程序会产生未知错误,因为计算机不知道该指针指向哪儿,如果指向了一个正在运行的程序,程序就是崩掉;
(3) *c也不受大小限制,与*b的区别是b的值能改变,可以指向其他字符地址,但c的地址不能改变,因为是常指针变量。
(4) d也不受大小限制,而且可以根据字符个数的多少来动态的分配内存空间;
(5). b 和c 的区别是b 能通过指针变量所指向地址的变化来改变其变量的值,但c不能。
5.memcpy(void*,const void*,size_t);的使用。把一段缓冲区负责到另一段缓冲上按照长度。
例子://把hello复制给str
memcpy(str,hello,sizeof(hello));
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );
6.内存地址sscanf();写个解析例子。
sscanf(strGood,"%s",&nCountT);把一个字符转为10进制数
sscanf(strGood,"%x",&nCountT);把一个16进制数转为10进制数
7.cFile.isDirectory()&&cFile.isDots()判断文件目录
8.原 浮点数用十六进制表示方式附C代码(float浮点转化)
浮点数用十六进制表示;我这里遇到的问题是知道数值,但需要把数值发送到上位机里显示波形,但是上位机是以浮点数的存储格式来解析的,但是我的单片机不支持float类
型,所以我的需求是把已知的数值看做是浮点数,然后把该数值以浮点数的存储方式存储到另外的一个变量,所以我的代码是把已知的数值用浮点数的存储方式表示出来,或者
说是计算已知数值的浮点数值。
举例:已知一个数为12,他的浮点数表示为 41400000h,我的目的就是把通过12计算出41400000h。
先说明下浮点数的存储原理,是网上别人写的,找不到连接了,把他说的先放前面
在二进制文件中,存储数据的格式为16进制,
下面举例说明27.0f在二进制文件中怎么表示。
float
共计32位,折合4字节
由最高到最低位分别是第31、30、29、……、0位
31位是符号位,1表示该数为负,0反之。
30-23位,一共8位是指数位。
22-0位,一共23位是尾数位。
每8位分为一组,分成4组,分别是A组、B组、C组、D组。
每一组是一个字节,在内存中逆序存储,即:DCBA
27.0表示成二进制为:11011.0
用科学计数法表示为1.10110*2^4,现在我们要的尾数和指数都出来了。
尾数为:1101 10 (删除前面的第一个1,因为用科学计数法表示,二进制中第一个永远都为1,计算机在存储的时候就没有存储这个1,只存储小数点后面的位数) 不足23
位,补0,就是1011 0000 0000 0000 0000 000(23位)
指数:为4 。一共8位,可以表示范围是0 ~ 255的无符号整数,也可以表示-128~127的有符号整数。但因为指数是可以为负的,所以为了统一把十进制的整数化为二进制时,都
先加上127。
所以:4+127=131 变成二进制就是10000011
27.0用二进制表示就是:
加上第31位的符号位0
就是0100 0001 1101 1000 0000 0000 0000 0000
十六进制就是:41 D8 00 00
再看一个数27.5,二进制为11011.1
1.10111*2^4
尾数(小数点后的数)10111,补够23位 1011 1000 0000 00000000 000
指数:4,加上127,就是131,二进制1000 0011
用二进制表示就是 (符号数位1位)0 (指数位8位)1000 0011 (尾数位23位)1011 1000 0000 00000000 000
写成二进制标准形式:0100 00011101 1100 0000 0000 0000 0000
写成16进制就是41 DC 00 00
此方法解析为:
char chData[10] = {0};
chData[0] = lpszResp[nHead + 10];
chData[1] = lpszResp[nHead + 9];
chData[2] = lpszResp[nHead + 8];
chData[3] = lpszResp[nHead + 7];
float* fData = (float*)chData;
double dData = (double)(*fData);
9.十进制转为十六进制代码:
char chPres8] = {0};
chPres0] = lpszResp[nHeadPos +53];A
chPres1] = lpszResp[nHeadPos +54];a
chPres2] = lpszResp[nHeadPos +55];2
chPres3] = lpszResp[nHeadPos +56];3
int i,m,temp=0,n;
m=strlen(chPres);
for(i=0;i<m;i++)
{
if(chPres[i]>='A'&&chPres[i]<='F')
n=chPres[i]-'A'+10;
else if(chPres[i]>='a'&&chPres[i]<='f')
n=chPres[i]-'a'+10;
else n=chPres[i]-'0';
temp=temp*16+n;
}
double dPres = temp/10.0;
10..定时器设置:
//参数设置dwStartTime是开始执行程序,dwEndTime是定时时间
BOOL JudgeTimer(DWORD dwStartTime,DWORD dwEndTime)
{
DWORD dwCurTime = GetTickCount();
if (dwStartTime <= dwEndTime)
{
if (dwCurTime >= dwEndTime|| dwStartTime > dwCurTime)
{
return TRUE;
}
}
else
{
if (dwCurTime < dwStartTime&& dwCurTime >= dwEndTime)
{
return TRUE;
}
}
return FALSE;
}
改变自己,从现在做起-----------久馆