文档库 最新最全的文档下载
当前位置:文档库 › ucos常用API函数

ucos常用API函数

ucos常用API函数
ucos常用API函数

任务管理

1 OSTaskCreate()

建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在正在运行的任务中建立。中断处理程序中不能建立任务。一个任务可以为无限循环的结构。

函数原型:

INT8U OSTaskCreate(void (*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);

参数说明:

task 是指向任务代码首地址的指针。

pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。

ptos 指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址以及任务被中断时的CPU寄存器内容。任务堆栈的大小决定于任务的需要及预计的中断嵌套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量OS_STK_GROWTH设为1,堆栈被设为从内存高地址向低地址增长,此时ptos应该指向任务堆栈空间的最高地址。反之,如果OS_STK_GROWTH设为0,堆栈将从内存的低地址向高地址增长。

prio为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。

返回值:

OSTaskCreate() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_PRIO_EXIST:具有该优先级的任务已经存在。

* OS_PRIO_INV ALID:参数指定的优先级大于OS_LOWEST_PRIO。

* OS_NO_MORE_TCB:系统中没有OS_TCB可以分配给任务了。

2 OSTaskSuspend()

无条件挂起一个任务。调用此函数的任务也可以传递参数OS_PRIO_SELF,挂起调用任务本身。当前任务挂起后,只有其他任务才能唤醒被挂起的任务。任务挂起后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒挂起任务需要调用函数OSTaskResume()。

任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。又如,任务被挂起时正在等待信号量,当任务从信号量的等待对列中清除后也不能立即运行,而必须等到被唤醒后。函数原型:

INT8U OSTaskSuspend(INT8U prio);

参数说明:

prio为指定要获取挂起的任务优先级,也可以指定参数OS_PRIO_SELF,挂起任务本身。此时,下一个优先级最高的就绪任务将运行。

返回值:

OSTaskSuspend() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_TASK_SUSPEND_IDLE:试图挂起μC/OS-II中的空闲任务(Idle task)。此为非法操作。* OS_PRIO_INV ALID:参数指定的优先级大于OS_LOWEST_PRIO 或没有设定OS_PRIO_SELF 的值。

* OS_TASK_SUSPEND_PRIO:要挂起的任务不存在。

3 OSTaskResume()

唤醒一个用OSTaskSuspend() 函数挂起的任务。OSTaskResume() 也是唯一能“解挂”挂起任务的函数。

函数原型:

INT8U OSTaskResume(INT8U prio);

参数说明:

prio指定要唤醒任务的优先级。

返回值:

OSTaskResume() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_TASK_RESUME_PRIO:要唤醒的任务不存在。

* OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。

* OS_PRIO_INV ALID:参数指定的优先级大于或等于OS_LOWEST_PRIO。

信号量

1 OSSemCreate()

该函数建立并初始化一个信号量,信号量的作用如下:

* 允许一个任务和其他任务或者中断同步

* 取得设备的使用权

* 标志事件的发生

函数原型:

OS_EVENT *OSSemCreate(INT16U value);

参数说明:

value 参数是所建立的信号量的初始值,可以取0到65535之间的任何值。

返回值:

OSSemCreate() 函数返回指向分配给所建立的信号量的控制块的指针。如果没有可用的控制块,OSSemCreate() 函数返回空指针。

2 OSSemPend()

该函数用于任务试图取得设备的使用权、任务需要和其他任务或中断同步、任务需要等待特定事件的发生的场合。如果任务调用OSSemPend() 函数时,信号量的值大于零,OSSemPend() 函数递减该值并返回该值。如果调用时信号量值等于零,OSSemPend() 函数将任务加入该信号量的等待队列。OSSemPend() 函数挂起当前任务直到其他的任务或中断设置信号量或超出等待的预期时间。如果在预期的时钟节拍内信号量被设置,μC/OS-Ⅱ默认让最高优先级的任务取得信号量并回到就绪状态。一个被OSTaskSuspend() 函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用OSTaskResume() 函数恢复该任务的运行。

函数原型:

void OSSemPend ( OS_EVNNT *pevent, INT16U timeout, int8u *err );

参数说明:

pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考OSSemCreate() 函数)。

timeout 允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时恢复就绪状态。如果该值为零表示任务将持续地等待信号量,最大的等待时间为

65535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差err 是指向包含错误码的变量的指针,返回的错误码可能为下述几种:

* OS_NO_ERR :信号量不为零。

* OS_TIMEOUT :信号量没有在指定数目的时钟周期内被设置。

* OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但μC/OS-Ⅱ仍然包含了检测这种情况的功能。

* OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。

返回值:

3 OSSemPost()

该函数用于设置指定的信号量。如果指定的信号量是零或大于零,OSSemPost() 函数递增该信号量的值并返回。如果有任何任务在等待该信号量,则最高优先级的任务将得到信号量并进入就绪状态。任务调度函数将进行任务调度,决定当前运行的任务是否仍然为最高优先级的就绪任务。

函数原型:

INT8U OSSemPost(OS_EVENT *pevent);

参数说明:

pevent 是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考OSSemCreate() 函数)。

返回值:

OSSemPost() 函数的返回值为下述之一:

* OS_NO_ERR :信号量被成功地设置

* OS_SEM_OVF :信号量的值溢出

* OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针

时间

1 OSTimeDly()

该函数用于将一个任务延时若干个时钟节拍。如果延时时间大于0,系统将立即进行任务调度。延时时间的长度可从0到65535个时钟节拍。延时时间0表示不进行延时,函数将立即返回调用者。延时的具体时间依赖于系统每秒钟有多少个时钟节拍(由文件OS_CFG.H 中的OS_TICKS_PER_SEC宏来设定)。

函数原型:

void OSTimeDly (INT16U ticks);

参数说明:

ticks 为要延时的时钟节拍数。

返回值:

2 OSTimeDlyHMSM()

该函数用于将一个任务延时若干时间。延时的单位是小时、分、秒、毫秒。调用OSTimeDlyHMSM() 后,如果延时时间不为0,系统将立即进行任务调度。

函数原型:

INT8U OSTimeDlyHMSM (INT8U hours,INT8U minutes,INT8U seconds,INT16U

milli);参数说明:

hours 为延时小时数,范围从0-255。

minutes 为延时分钟数,范围从0-59。

seconds 为延时秒数,范围从0-59

milli 为延时毫秒数,范围从0-999。

需要说明的是,操作系统在处理延时操作时都是以时钟节拍为单位的,实际的延时时间是时钟节拍的整数倍。如果系统时钟节拍的间隔是10ms,而设定延时为5ms的话,则不会产生延时操作;而如果设定延时为15ms,则实际的延时是两个时钟节拍,也就是20ms。

返回值:

OSTimeDlyHMSM() 的返回值为下述之一:

* OS_NO_ERR:函数调用成功。

* OS_TIME_INV ALID_MINUTES:参数错误,分钟数大于59。

* OS_TIME_INV ALID_SECONDS:参数错误,秒数大于59。

* OS_TIME_INV ALID_MILLI:参数错误,毫秒数大于999。

* OS_TIME_ZERO_DL Y:四个参数全为0。

内存管理

1. OSMemCreate()

该函数建立并初始化一个用于动态内存分配的区域,该内存区域包含指定数目的、大小确定的内存块。应用可以动态申请这些内存块并在用完后将其释放回这个内存区域。该函数的返回值就是指向这个内存区域控制块的指针,并作为OSMemGet(),OSMemPut(),OSMemQuery() 等相关调用的参数。

函数原型:

OS_MEM *OSMemCreate( void *addr, INT32U nblks, INT32U blksize, INT8U *err ); 参数说明:

addr 建立的内存区域的起始地址。可以使用静态数组或在系统初始化时使用malloc() 函数来分配这个区域的空间。

nblks 内存块的数目。每一个内存区域最少需要定义两个内存块。

blksize 每个内存块的大小,最小应该能够容纳一个指针变量。

err 是指向包含错误码的变量的指针。Err可能是如下几种情况:

* OS_NO_ERR :成功建立内存区域。

* OS_MEM_INV ALID_ADDR :非法地址,即地址为空指针。

* OS_MEM_INV ALID_PART :没有空闲的内存区域。

* OS_MEM_INV ALID_BLKS :没有为内存区域建立至少两个内存块。

* OS_MEM_INV ALID_SIZE :内存块大小不足以容纳一个指针变量。

返回值:

OSMemCreate() 函数返回指向所创建的内存区域控制块的指针。如果创建失败,函数返回空指针。

2 OSMemGet()

该函数用于从内存区域分配一个内存块。用户程序必须知道所建立的内存块的大小,并必须在使用完内存块后释放它。可以多次调用OSMemGet() 函数。它的返回值就是指向所分配内存块的指针,并作为OSMemPut() 函数的参数。

函数原型:

void *OSMemGet(OS_MEM *pmem, INT8U *err);

参数说明:

pmem 是指向内存区域控制块的指针,可以从OSMemCreate() 函数的返回值中得到。

err 是指向包含错误码的变量的指针。Err可能是如下情况:

* OS_NO_ERR :成功得到一个内存块。

* OS_MEM_NO_FREE_BLKS :内存区域中已经没有足够的内存块。

返回值:

OSMemGet() 函数返回指向所分配内存块的指针。如果没有可分配的内存块,OSMemGet() 函数返回空指针。

3 OSMemPut()

该函数用于释放一个内存块,内存块必须释放回它原先所在的内存区域,否则会造成系统错误。

函数原型:

INT8U OSMemPut (OS_MEM *pmem, void *pblk);

参数说明:pmem 是指向内存区域控制块的指针,可以从OSMemCreate() 函数的返回值中得到。

pblk 是指向将被释放的内存块的指针。

返回值:

OSMemPut() 函数的返回值为下述之一:

* OS_NO_ERR :成功释放内存块

* OS_MEM_FULL :内存区域已满,不能再接受更多释放的内存块。这种情况说明用户程序出现了错误,释放了多于用OSMemGet() 函数得到的内存块。

4 OSMemQuery()

该函数用于得到内存区域的信息。

函数原型:

INT8U OSMemQuery(OS_MEM *pmem, OS_MEM_DATA *pdata);

参数说明:

pmem 是指向内存区域控制块的指针,可以从OSMemCreate() 函数的返回值中得到。

pdata 是一个指向OS_MEM_DATA 数据结构的指针,该数据结构包含了以下的域:void OSAddr; /* 指向内存区域起始地址的指针*/

void OSFreeList; /* 指向空闲内存块列表起始地址的指针*/

INT32U OSBlkSize; /* 每个内存块的大小*/

INT32U OSNBlks; /* 该内存区域中的内存块总数*/

INT32U OSNFree; /* 空闲的内存块数目*/

INT32U OSNUsed; /* 已使用的内存块数目*/

消息队列

1 OSQCreate()

该函数用于建立一个消息队列。任务或中断可以通过消息队列向一个或多个任务发送消息。消息的含义是和具体的应用密切相关的。

函数原型:

OS_EVENT *OSQCreate (void **start, INT8U size);

参数说明:

start 是消息内存区的首地址,消息内存区是一个指针数组。

size 是消息内存区的大小。

返回值:

OSQCreate() 函数返回一个指向消息队列控制块的指针。如果没有空闲的控制块,OSQCreate() 函数返回空指针。

2 OSQPend()

该函数用于任务等待消息。消息通过中断或任务发送给需要的任务。消息是一个指针变量,在不同的应用中消息的具体含义不同。如果调用OSQPend() 函数时队列中已经存在消息,那么该消息被返回给OSQPend() 函数的调用者,该消息同时从队列中清除。如果调用OSQPend() 函数时队列中没有消息,OSQPend() 函数挂起调用任务直到得到消息或超出定义的超时时间。如果同时有多个任务等待同一个消息,μC/OS-Ⅱ默认最高优先级的任务取得消息。一个由OSTaskSuspend() 函数挂起的任务也可以接受消息,但这个任务将一直保持挂起状态直到通过调用OSTaskResume() 函数恢复任务的运行。

函数原型:

void *OSQPend (OS_EVENT *pevent, INT16U timeout, INT8U *err);

参数说明:

pevent 是指向消息队列的指针,该指针的值在建立该队列时可以得到。(参考OSQCreate() 函数)。

timeout 允许一个任务以指定数目的时钟节拍等待消息。超时后如果还没有得到消息则恢复成就绪状态。如果该值设置成零则表示任务将持续地等待消息,最大的等待时间为65535个时钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差。

err 是指向包含错误码的变量的指针。OSQPend() 函数返回的错误码可能为下述几种: * OS_NO_ERR :消息被正确地接受。

* OS_TIMEOUT :消息没有在指定的时钟周期数内接收到消息。

* OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断中调用该函数,但μC/OS-Ⅱ仍然包含了检测这种情况的功能。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。

返回值:

OSQPend() 函数返回取得的消息并将*err 置为OS_NO_ERR。如果没有在指定数目的时钟节拍内接受到消息,OSQPend() 函数返回空指针并将*err 设置为OS_TIMEOUT。

3 OSQPostFront()

该函数用于向消息队列发送消息。OSQPostFront() 函数和OSQPost() 函数非常相似,不同之处在于OSQPostFront() 函数将发送的消息插到消息队列的最前端。也就是说,OSQPostFront() 函数使得消息队列按照后入先出(LIFO)的方式工作,而不是先入先出(FIFO)。消息是一个指针长度的变量,在不同的应用中消息的含义也可能不同。如果队列中已经存满消息,则此调用将返回错误码。OSQPost() 函数也是如此。在调用此函数时如果有任何任务在等待队列中的消息,则最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务在得到消息后将立即抢占当前任务执行,也就是说,将发生一次任务切换。

函数原型:

INT8U OSQPostFront(OS_EVENT *pevent, void *msg);

参数说明:

pevent 是指向即将接收消息的消息队列的指针。该指针的值在建立队列时可以得到。(参考OSQCreate() 函数)。

msg 是即将发送的消息的指针。不允许传递一个空指针。

返回值:

OSQPostFront() 函数的返回值为下述之一:

* OS_NO_ERR :消息成功地放到消息队列中。

* OS_Q_FULL :消息队列已满。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。

4 OSQPost()

该函数用于向消息队列发送消息。消息是一个指针长度的变量,在不同的应用中消息的含义也可能不同。如果队列中已经存满消息,则此调用返回错误码。如果有任何任务在等待队列中的消息,则最高优先级的任务将得到这个消息。如果等待消息的任务优先级比发送消息的任务优先级高,那么高优先级的任务将在得到消息后立即抢占当前任务执行,也就是说,将发生一次任务切换。消息是以先入先出(FIFO)方式进入队列的,即先进入队列的消息先被传递给任务。

函数原型:

INT8U OSQPost(OS_EVENT *pevent, void *msg);

参数说明:

pevent 是指向即将接受消息的消息队列的指针。该指针的值在建立队列时可以得到。(参考OSQCreate() 函数)。

msg 是即将发送给队列的消息。不允许传递一个空指针。

返回值:

OSQPost() 函数的返回值为下述之一:

* OS_NO_ERR :消息成功地放到消息队列中。

* OS_Q_FULL :消息队列已满。

* OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。

5 OSQFlush()

该函数用于清空消息队列。

函数原型:

INT8U *OSQFlush(OS_EVENT *pevent);

参数说明:

pevent 是指向消息队列的指针。该指针的值在建立队列时可以得到。(参考OSQCreate() 函数)。

返回值:

OSQFlush() 函数的返回值为下述之一:

* OS_NO_ERR :消息队列被成功清空

* OS_ERR_EVENT_TYPE :试图清除不是消息队列的对象

6 OSQQuery()

该函数用来取得消息队列的信息。用户程序必须建立一个OS_Q_DA TA 的数据结构,该结构用来保存从消息队列的控制块得到的数据。通过调用该函数可以知道是否有任务在等待消息、有多少个任务在等待消息、队列中有多少消息以及消息队列可以容纳的消息数。OSQQuery() 函数还可以得到即将被传递给任务的消息。

函数原型:

INT8U OSQQuery(OS_EVENT *pevent, OS_Q_DA TA *pdata);

参数说明:

pevent 是指向消息队列的指针。该指针的值在建立消息队列时可以得到。(参考OSQCreate() 函数)。

pdata 是指向OS_Q_DATA 数据结构的指针,该数据结构包含下述成员:

void *OSMsg; /* 下一个可用的消息*/

INT16U OSNMsgs; /* 队列中的消息数目*/

INT16U OSQSize; /* 消息队列的大小*/

INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; /* 消息队列的等待队列*/ INT8U OSEventGrp;

返回值:

OSQQuery() 函数的返回值为下述之一:

* OS_NO_ERR :调用成功

* OS_ERR_EVENT_TYPE :pevent 不是指向消息队列的指针。

04 FunCode C 开发常用API

FunCode C开发常用API C语言标准库函数 在实验中,我们需要用到一些C语言标准库函数,主要用于字符串处理,获得随机值,处理数学函数等。 Math.h 函数原型功能与返回值参数说明与应用举例 public static double atan2( double y, double x );返回两点之间的正 切值 x:点的x坐标 y:点的y坐标 float ftan = atan2((fMouseY-fY),(fMouseX-fX)); float sqrt( float x ); 功能:计算平方根 返回值:x的平方根 sqrt(9) = 3 Stdio.h 函数原型功能与返回值参数说明与应用举例 int sprintf( char *buffer, const char *format, [ argument] … ); 把格式化的数据写 入某个字符串缓冲 区。 返回值:字符串长 度(strlen) buffer:char型指针,指向将要写入的 字符串的缓冲区。 format:char型指针,指向的内存里面 存放的将要格式字符串。 [argument]...:可选参数,可以是任何类 型的数据。 sprintf(szUfoName,"ufo_%d_%d", iLoop, iTotalUfoCount ); String.h 函数原型功能与返回值参数说明与应用举例 extern char *strstr( char *str1, char *str2 );找出str2字符串 在str1字符串中 第一次出现的位置 (不包括str2的 串结束符)。 返回值:返回该位 置的指针,如找不 到,返回空指针。 strstr(szName, “feichong”) != NULL 说明szName中包含feichong 可以用来判断前一个字符串包含后面 一个字符串 extern int strcmp( const char *s1, const char * s2 );比较字符串s1和 s2。 当s1

常用MFC和API函数

常用MFC和API函数 索引 CArchive类:用于二进制保存档案 CBitmap类:封装Windows的图形设备接口(GDI)位图 CBrush类:封装图形设备接口(GDI)中的画刷 CButton类:提供Windows按钮控件的功能 CByteArray类:该类支持动态的字节数组 CCmdUI类:该类仅用于ON_UPDATE_COMMAND_UI处理函数中 CColorDialog类:封装标准颜色对话框 CDC类:定义设备环境对象类 CDialog类:所有对话框(模态或非模态)的基类 CDocument类:提供用户定义的文档类的基本功能 CEdit类:是一个用于编辑控件的类 CFile类:该类是基本文件类的基类 CFileDialog类:封装了打开和保存文件的标准对话框 CFindReplaceDialog类:封装了标准查找/替换对话框 CFont类:封装了Windows图形设备接口(GDI)中的字体对象 CFontDialog类:封装了字体选择对话框 CGdiObject类:GDI绘图工具的基类 CIPAddressCtrl类:提供了IP地址控件的功能 CImageList类:管理大小相同的图标或位图集 CMenu类:封装应用程序菜单栏和弹出式菜单 CPen类:封装了Windows图形设备接口(GDI)中的画笔对象 CPoint类:操作CPoint和POINT结构 CRect类:封装了一个矩形区域及相关操作 CRgn类:封装用于操作窗口中的椭圆、多边形或者不规则区域的GDI区域 CSize类:用于表示相对坐标或位置 CSpinButtonCtrl类:旋转控件Spin的控制类 CStatusBar类:状态栏窗口的基类 CString类:处理字符串 CStringList类:支持CString对象的列表 CWinApp类:派生的程序对象的基类 CWnd类:提供所有窗口类的基本函数 API函数 CArchive类:用于二进制保存档案 CArchive::CArchive 建立一个CArchive对象 CArchive(CFile* pFile,UINT nMode,int nBufSize=4096,void* lpBuf=NULL); 参数:pFile 指向CFile对象的指针,这个CFile对象是数据的最终源或目的;nMode是标志,取值为CArchive::load时,从文档中加载数据(要求CFile读许可),取值为CArchive::store时,将数据存入文档(要求CFile写许可);nBufSize 指定内部文件缓冲区的大小(按字节计); lpBuf 指向大小为nBufSize的缓冲区,若未指定,则从局部堆中分配一缓冲区,

什么是哈希函数

什么是哈希函数 哈希(Hash)函数在中文中有很多译名,有些人根据Hash的英文原意译为“散列函数”或“杂凑函数”,有些人干脆把它音译为“哈希函数”,还有些人根据Hash函数的功能译为“压缩函数”、“消息摘要函数”、“指纹函数”、“单向散列函数”等等。 1、Hash算法是把任意长度的输入数据经过算法压缩,输出一个尺寸小了很多的固定长度的数据,即哈希值。哈希值也称为输入数据的数字指纹(Digital Fingerprint)或消息摘要(Message Digest)等。Hash函数具备以下的性质: 2、给定输入数据,很容易计算出它的哈希值; 3、反过来,给定哈希值,倒推出输入数据则很难,计算上不可行。这就是哈希函数的单向性,在技术上称为抗原像攻击性; 4、给定哈希值,想要找出能够产生同样的哈希值的两个不同的输入数据,(这种情况称为碰撞,Collision),这很难,计算上不可行,在技术上称为抗碰撞攻击性; 5、哈希值不表达任何关于输入数据的信息。 哈希函数在实际中有多种应用,在信息安全领域中更受到重视。从哈希函数的特性,我们不难想象,我们可以在某些场合下,让哈希值来“代表”信息本身。例如,检验哈希值是否发生改变,借以判断信息本身是否发生了改变。` 怎样构建数字签名 好了,有了Hash函数,我们可以来构建真正实用的数字签名了。 发信者在发信前使用哈希算法求出待发信息的数字摘要,然后用私钥对这个数字摘要,而不是待发信息本身,进行加密而形成一段信息,这段信息称为数字签名。发信时将这个数字签名信息附在待发信息后面,一起发送过去。收信者收到信息后,一方面用发信者的公钥对数字签名解密,得到一个摘要H;另一方面把收到的信息本身用哈希算法求出另一个摘要H’,再把H和H’相比较,看看两者是否相同。根据哈希函数的特性,我们可以让简短的摘要来“代表”信息本身,如果两个摘要H和H’完全符合,证明信息是完整的;如果不符合,就说明信息被人篡改了。 数字签名也可以用在非通信,即离线的场合,同样具有以上功能和特性。 由于摘要一般只有128位或160位比特,比信息本身要短许多倍,USB Key或IC卡中的微处理器对摘要进行加密就变得很容易,数字签名的过程一般在一秒钟内即可完成。

数据库常用函数汇总统计

实验二(续):利用SQL语句查询 三、常用库函数及统计汇总查询 1、求学号为 S1学生的总分和平均分; select sum(score) as TotalScore,avg(score)as AveScore from sc where sno='S1' 2、求选修 C1号课程的最高分、最低分及之间相差的分数; select max(score)as MaxScore, min(score)as MinScore, max(score)- min(score)as diff from sc where cno='C1' 3、求选修 C1号课程的学生人数和最高分; select count(distinct sno),max(score) from sc where cno='C 1' 4、求计算机系学生的总数; select count(sno) from s where dept=' 计算机 ' 5、求学校中共有多少个系; select count(distinct dept) as DeptNum from s 6、统计有成绩同学的人数; select count(score) from sc 7、利用特殊函数 COUNT(*)求计算机系学生的总数; select count(*) from s where dept=' 计算机 '

8、利用特殊函数 COUNT(*)求女学生总数和平均年龄;select count(*),avg(age) from s where sex=' 女 ' 9、利用特殊函数 COUNT(*)求计算机系女教师的总数。select count(*) from t where dept=' 计算机 'and sex=' 女 ' 四、分组查询及排序 1、查询各个教师的教师号及其任课门数; select tno,count(*)as c_num from tc group by tno 2、按系统计女教师的人数; select dept,count(tno) from t where sex=' 女 ' group by dept 3、查询选修两门以上课程的学生的学号和选课门数;select sno,count(*)as sc_num from sc group by sno having count(*)>2 4、查询平均成绩大于 70分的课程号和平均成绩; select cno,avg(score) from sc group by cno having avg(score)>70 5、查询选修 C1的学生学号和成绩,并按成绩降序排列;select sno,score

常用API函数参数

常用API函数参数5 ImmIsIME 函数功能: 判断指定的句柄是否为IME; 函数原型: BOOL ImmIsIME( HKL hKL ); 参数hKL: 待检查的键盘布局句柄; 返回值: 函数调用成功返回1,失败返回0. 速查信息: Windows NT: 要求4.0或更高版本 Windows: 要求Windows 95 或更高. Windows CE:不支持. Header: 声明在imm.h. Import Library: imm32.lib. Windows XP没有自带五笔型输入法,这对五笔型用户而言无疑是个大大的遗憾。网上的五笔型输入法虽然种类很多,也不乏优秀的版本,但一方面有些版本是共享软件需要注册,另一方面也许很多五笔型输入法的老用户最习惯用的还是老牌的“王码五笔型输入法86/98版”。 微软的Office XP软件中包含了这个老牌的五笔型输入法,但如果用户并不使用Office XP中的任何组件,仅仅是为了使用“王码五笔型输入法”而运行Office XP安装程序,就显的有些小题大做了,更不用说是某些零时在外面用公用电脑而又想用五笔型输入法的情况。于是网上出现了很多简化的安装方法,大体上可以分为三个步骤: 拷贝输入法文件(从Of还是9x/ME。示例代码fice XP光盘中或已经安装了“王码五笔型输入法”的电脑中提取) 增加注册表项 重启后通过控制面板添加输入法

整个过程中拷贝输入法文件和增加注册表项可以用批处理和导入注册表文件来简化操作,但必须重启计算机才能在控制面板里添加输入法,这同样让使用者觉得比较烦琐。那么作为一个编程爱好者能不能通过写个小程序来实现在不重新启动计算机的情况下全自动的安装“王码五笔型输入法”呢(也就是即装即用)?答案是肯定的!因为微软的Office XP 安装程序做到了,这就表示微软肯定留有一个专门用来安装输入法的接口,一般来说应该是一系列API函数。 经过一番摸索,笔者在MSDN里找到了这个可以用来安装输入法的API:ImmInstallIME()。Ok,现在我们就开始利用这个API来实现自己的“王码五笔型输入法”全自动安装程序。 一、准备素材 我们先试着从Office XP光盘中提取“王码五笔型输入法”的输入法文件。通过Windows 的查找功能在Office XP的第一张安装盘中查找与“WINWB”相关的文件,在OFFICE1.CAB 中找到了一下14个文件:WINWB86.CHM.*、https://www.wendangku.net/doc/5d8868561.html,T.*、WINWB86.HLP.*、WINWB86A.IME.*、WINWB86A.MB.*、WINWB86W.IME.*、WINWB86W.MB.*、WINWB98.CHM.*、https://www.wendangku.net/doc/5d8868561.html,T.*、WINWB98.HLP.*、WINWB98A.IME.*、WINWB98A.MB.*、WINWB98W.IME.*、WINWB98W.MB.*,其中*是很长的一串由字母、数字和下滑线组成的序列(个人认为应该是微软为了校验文件内容的正确性而加上的内容为该文件效验码的后缀吧)。去掉这个长长的后缀,可以看到5 种类型的文件。很明显,*.CHM、*.CNT和*.HLP是五笔型输入法的帮助文件,*.MB是码表文件,而*.IME是主要的输入法文件。其中*.IME和*.MB有文件名部分以A结尾和以W结尾两个版本,经过笔者试验证实了它们分别是ANSI和UNICODE两种版本的输入法文件。文件名部分以A结尾的文件适用于Windows 9x,以W结尾的文件适用于NT系列Windows系统。 提取了输入法文件后必须让安装程序针对不同版本的操作系统将它们拷贝到正确的目录,以便调用API来进行输入法安装。笔者分别在安装了Office XP中自带的“王码五笔型输入法”的Windows 98SE和Windows XP操作系统中查找以上文件,发现帮助文件都存放在WINDOWSHELP目录中(这里假设Windows系统都安装在WINDOWS目录)。而主要的输入法文件(*.IME)和码表文件(*.MB)在Windows 9x下存放于WINDOWSSYSTEM目录中,在NT系列Windows系统中存放于WINDOWSSYSTEM32目录中。 二、相关API函数 素材的准备工作已经完成,现在我们来看一下代码编写过程中需要用到的4个主要的API函数。 2.1 GetVersion 函数原型:

最小完美哈希函数(深入搜索引擎)

最小完美哈希函数 哈希函数h是一个能够将n个键值x j的集合映射到一个整数集合的函数h(x i),其值域范围是0≤h(x j)≤m-l,允许重复。哈希是一个具有查找表功能并且提供平均情况下快速访问的标准方法。例如,当数 据包含n个整数键值。某常用哈希函数采用h(x)=x mod m,其中m 是一个较小的值,且满足m>n/a。a是装载因子,表示记录数和可用地址数的比例关系。m一般选择一个素数,因此如果要求提供一个对1000个整数键值进行哈希的函数,一个程序员可能会建议写出如下函数形式:,h(x)=x mod 1399。并且提供一个装载因子为。a=0.7的表,该表声明能够存放1399个地址。 a越小,两个不同键值在相同哈希值相互冲突的可能性就越小,然而冲突总是不可避免。第1次考虑这个问题时,事实可能让人吃惊,最好的例子莫过于著名的生日悖论(birthday paradox)。假定一年有365天,那么要组合多少个人,才能使得出现生日相同的人这一概率超过0.5呢?换句话说,给定一个365个哈希槽(hashslot)。随机选择多少个键值才能够使得出现冲突的概率超过0.5?当首次面对这样一个问题时,一般的反应肯定是认为需要很多人才行。事实上,答案是只需区区23人。找到一个能够满足现实大小要求且无冲突的哈希函数的几率小到几乎可以忽略25。例如,一个1000个键值和1399个随机选择的槽,完全没有冲突的概率为 2.35×10-217(概率的计算诱导公式将在下一节中给出,以公式4.1代入m=1399和n=1000得到),如何才能最好地处理这些不可避免冲突?这一话题将在本节中以大段篇幅展开,这里我们正是要找到其中万里挑一的能够避免所有冲突的哈 希函数。 25可以试图在一群人中做这样一个有趣的实验,笔者曾在讲述哈希表的课上和同学们做 过多次这样的实验。有一项很重要的事情往往被我们忽略,即参加者必须事先在纸上写下他们的生日(或者其他任意日子)。然后才能开始核对的工作,这样才能消除神奇的负反馈。在我们的实验中,除非这样做了,否则也许必须找到366个同学才能遇到第1次碰撞,也许这乜存在心理学悖论吧。

API函数手册

POSTEK PPLⅠAPI函数手册 G Series 条码标签打印机 Version 2.00 深圳市博思得通信发展有限公司 二○○四年

API函数库文件说明 名称:CDFPSK.dll 中文版本编号:1.X.X.X 英文版本编号:2.X.X.X 版权所有:?2004深圳市博思得通信发展有限公司。保留所有权利。 用途 本API函数库为深圳市博思得通信发展有限公司条码标签打印机的用户提供一组命令,为他们编写基于Windows9X,NT,2000,XP等操作系统的应用程序提供便利。 本API函数库仅支持本公司产品。 缩略语对照 PPLⅠ:深圳市博思得通信发展有限公司的第一套打印机编程语言(Printer Porgram Language Ⅰ)。 API:应用程序编程接口(Application Program Interface)。 Dots:像素(pixel)是一种计算机科学技术尺寸单位,原指电视图像成像的最小单位,在打印机领域表示打印机的最小打印成像单位:1dot等于一英寸除以打印机的最大分辨率。 - 对于203DPI的打印机来说, 1dot = 25.4mm/203 = 0.125mm(1dot = 1000 / 203 = 5mil); - 对于300DPI的打印机来说, 1dot = 25.4mm/300 = 0.085mm(1dot = 1000 / 300 = 3mil)。 TrueType Font:是基于Windows操作系统使用,可装卸的字体。 - 已经安装的TrueType Font,都可以被本函数使用。 使用前须知 字符串 * 字符串以双引号(“)作为起始和结束标记; *

哈 希 常 见 算 法 及 原 理

数据结构与算法-基础算法篇-哈希算法 1. 哈希算法 如何防止数据库中的用户信息被脱库? 你会如何存储用户密码这么重要的数据吗?仅仅 MD5 加密一下存储就够了吗? 在实际开发中,我们应该如何用哈希算法解决问题? 1. 什么是哈希算法? 将任意长度的二进制值串映射成固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 2. 如何设计一个优秀的哈希算法? 单向哈希: 从哈希值不能反向推导出哈希值(所以哈希算法也叫单向哈希算法)。 篡改无效: 对输入敏感,哪怕原始数据只修改一个Bit,最后得到的哈希值也大不相同。 散列冲突: 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小。 执行效率: 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速计算哈

希值。 2. 哈希算法的常见应用有哪些? 7个常见应用:安全加密、唯一标识、数据校验、散列函数、负载均衡、数据分片、分布式存储。 1. 安全加密 常用于加密的哈希算法: MD5:MD5 Message-Digest Algorithm,MD5消息摘要算法 SHA:Secure Hash Algorithm,安全散列算法 DES:Data Encryption Standard,数据加密标准 AES:Advanced Encryption Standard,高级加密标准 对用于加密的哈希算法,有两点格外重要,第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要小。 在实际开发中要权衡破解难度和计算时间来决定究竟使用哪种加密算法。 2. 唯一标识 通过哈希算法计算出数据的唯一标识,从而用于高效检索数据。 3. 数据校验 利用哈希算法对输入数据敏感的特点,可以对数据取哈希值,从而高效校验数据是否被篡改过。 4. 散列函数 1.如何防止数据库中的用户信息被脱库?你会如何存储用户密码这么重要的数据吗?

API函数大全

? 1. API之网络函数 ? ?WNetAddConnection 创建同一个网络资源的永久性连接 ? ?WNetAddConnection2 创建同一个网络资源的连接 WNetAddConnection3 创建同一个网络资源的连接 WNetCancelConnection 结束一个网络连接 WNetCancelConnection2 结束一个网络连接 WNetCloseEnum 结束一次枚举操作 WNetConnectionDialog 启动一个标准对话框,以便建立同网络资源的连接 WNetDisconnectDialog 启动一个标准对话框,以便断开同网络资源的连接 WNetEnumResource 枚举网络资源 WNetGetConnection 获取本地或已连接的一个资源的网络名称 WNetGetLastError 获取网络错误的扩展错误信息 WNetGetUniversalName 获取网络中一个文件的远程名称以及/或者UNC (统一命名规范)名称 WNetGetUser 获取一个网络资源用以连接的名字 WNetOpenEnum 启动对网络资源进行枚举的过程 ? ? 2. API之消息函数 ?BroadcastSystemMessage 将一条系统消息广播给系统中所有的顶级窗口GetMessagePos 取得消息队列中上一条消息处理完毕时的鼠标指针屏幕位置 GetMessageTime 取得消息队列中上一条消息处理完毕时的时间 PostMessage 将一条消息投递到指定窗口的消息队列 PostThreadMessage 将一条消息投递给应用程序 RegisterWindowMessage 获取分配给一个字串标识符的消息编号 ReplyMessage 答复一个消息 SendMessage 调用一个窗口的窗口函数,将一条消息发给那个窗口 SendMessageCallback 将一条消息发给窗口 SendMessageTimeout 向窗口发送一条消息 SendNotifyMessage 向窗口发送一条消息 ? 3. API之文件处理函数 ?CloseHandle 关闭一个内核对象。其中包括文件、文件映射、进程、线程、安全和同步对象等 CompareFileTime 对比两个文件的时间 CopyFile 复制文件 CreateDirectory 创建一个新目录 CreateFile 打开和创建文件、管道、邮槽、通信服务、设备以及控制台CreateFileMapping 创建一个新的文件映射对象 DeleteFile 删除指定文件 DeviceIoControl 对设备执行指定的操作

哈 希 常 见 算 法 及 原 理

计算与数据结构篇 - 哈希算法 (Hash) 计算与数据结构篇 - 哈希算法 (Hash) 哈希算法的定义和原理非常简单,基本上一句话就可以概括了。将任意长度的二进制值串映射为固定长度的二进制值串,这个映射的规则就是哈希算法,而通过原始数据映射之后得到的二进制值串就是哈希值。 构成哈希算法的条件: 从哈希值不能反向推导出原始数据(所以哈希算法也叫单向哈希算法)对输入数据非常敏感,哪怕原始数据只修改了一个 Bit,最后得到的哈希值也大不相同; 散列冲突的概率要很小,对于不同的原始数据,哈希值相同的概率非常小; 哈希算法的执行效率要尽量高效,针对较长的文本,也能快速地计算出哈希值。 哈希算法的应用(上篇) 安全加密 说到哈希算法的应用,最先想到的应该就是安全加密。最常用于加密的哈希算法是 MD5(MD5 Message-Digest Algorithm,MD5 消息摘要算法)和 SHA(Secure Hash Algorithm,安全散列算法)。 除了这两个之外,当然还有很多其他加密算法,比如 DES(Data Encryption Standard,数据加密标准)、AES(Advanced Encryption Standard,高级加密标准)。

前面我讲到的哈希算法四点要求,对用于加密的哈希算法来说,有两点格外重要。第一点是很难根据哈希值反向推导出原始数据,第二点是散列冲突的概率要很小。 不过,即便哈希算法存在散列冲突的情况,但是因为哈希值的范围很大,冲突的概率极低,所以相对来说还是很难破解的。像 MD5,有 2^128 个不同的哈希值,这个数据已经是一个天文数字了,所以散列冲突的概率要小于 1-2^128。 如果我们拿到一个 MD5 哈希值,希望通过毫无规律的穷举的方法,找到跟这个 MD5 值相同的另一个数据,那耗费的时间应该是个天文数字。所以,即便哈希算法存在冲突,但是在有限的时间和资-源下,哈希算法还是被很难破解的。 对于加密知识点的补充,md5这个算法固然安全可靠,但网络上也有针对MD5中出现的彩虹表,最常见的思路是在密码后面添加一组盐码(salt), 比如可以使用md5(1234567.'2019@STARK-%$#-idje-789'),2019@STARK-%$#-idje-789 作为盐码起到了一定的保护和安全的作用。 唯一标识(uuid) 我们可以给每一个图片取一个唯一标识,或者说信息摘要。比如,我们可以从图片的二进制码串开头取 100 个字节,从中间取 100 个字节,从最后再取 100 个字节,然后将这 300 个字节放到一块,通过哈希算法(比如 MD5),得到一个哈希字符串,用它作为图片的唯一标识。通过这个唯一标识来判定图片是否在图库中,这样就可以减少很多工作量。

常用函数大全

常用函数大全 mysql_affected_rows
mysql_affected_rows — 取得前一次 MySQL 操作所影响的记录行数 mysql_fetch_array —从结果集中取得一行作为关联数组或数字数组或二者兼 有:
mysql_fetch_array($result, MYSQL_NUM) , MYSQL_NUM 可用 MYSQL_BOTH 或
MYSQL_ASSOC 代替,也可以不写,默认为 MYSQL_BOTH
mysql_fetch_row — 从结果集中取得一行作为枚举数组: mysql_fetch_row($result); mysql_fetch_assoc($result)
mysql_fetch_row()从和指定的结果标识关联的结果集中取得一行数据并作为数组返回。每个结果 的列储存在一个数组的单元中,偏移量从 0 开始。 依次调用 mysql_fetch_row()将返回结果集中的下一行,如果没有更多行则返回 FALSE。 mysql_fetch_assoc — 从结果集中取得一行作为关联数组 :
mysql_fetch_assoc() 和用 mysql_fetch_array() 加上第二个可选参数 MYSQL_ASSOC 完全相同。它 仅仅返回关联数组。这也是 mysql_fetch_array()起初始的工作方式。如果在关联索引之外还需要数字 索引,用 mysql_fetch_array()。 如果结果中的两个或以上的列具有相同字段名,最后一列将优先。要访问同名的其它列,要么用 mysql_fetch_row()来取得数字索引或给该列起个别名。参见 mysql_fetch_array() 例子中有关别名说 明。 有一点很重要必须指出,用 mysql_fetch_assoc()并不明显 比用 mysql_fetch_row()慢,而且还提供了 明显更多的值。
mysql_query()
仅对 SELECT,SHOW,EXPLAIN 或 DESCRIBE 语句返回一个资源标识符,
如果查询执行不正确则返回 FALSE。对于其它类型的 SQL 语句,mysql_query()在执行成功时返回 TRUE,出错时返回 FALSE。非 FALSE 的返回值意味着查询是合法的并能够被服务器执行。这并不说明 任何有关影响到的或返回的行数。 很有可能一条查询执行成功了但并未影响到或并未返回任何行。

哈希的基本概念

6、8 哈希表及其查找★3◎4 哈希译自“hash"一词,也称为散列或杂凑。?哈希表查找得基本思想就是:根据当前待查找数据得特征,以记录关键字为自变量,设计一个哈希函数,依该函数按关键码计算元素得存储位置,并按此存放;查找时,由同一个函数对给定值key计算地址,将key与地址单元中元素关键码进行比较,确定查找就是否成功。哈希方法中使用得转换函数称为哈希函数(杂凑函数),按这个思想构造得表称为哈希表(杂凑表)。?对于n个数据元素得集合,总能找到关键码与存放地址一一对应得函数、若最大关键为m,可以分配m个数据元素存放单元,选取函数f(ke y)=key即可,但这样会造成存储空间得很大浪费,甚至不可能分配这么大得存储空间、通常关键码得集合比哈希地址集合大得多,因而经过哈希函数变换后,可能将不同得关键码映射到同一个哈希地址上,这种现象称为冲突(Collisio n)。映射到同一哈希地址上得关键码称为同义词。可以说,冲突不可能避免,只能尽可能减少。所以,哈希方法需要解决以下两个问题:?(1)构造好得哈希函数?①所选函数尽可能简单,以便提高转换速度。?②所选函数对关键码计算出得地址,应在哈希地址集中大致均匀分布,以减少空间浪费。 (2)制定解决冲突得方案 1.常用得哈希函数 (1)直接定址法 即取关键码得某个线性函数值为哈希地址,这类函数就是一一对应函数,不会产生冲突,但要求地址集合与关键码集合大小相同,因此,对于较大得关键码集合不适用。如关键码集合为{100,300,500,700,800,900},选取哈希函数为Ha

sh(key)=key/100,则存放如表6-3所示。 表6—3 直接定址法构造哈希表 (2)除留余数法 即取关键码除以p得余数作为哈希地址。使用除留余数法,选取合适得p很重要,若哈希表表长为m,则要求p≤m,且接近m或等于m。p一般选取质数,也可以就是不包含小于20质因子得合数、?(3)数字分析法 设关键码集合中,每个关键码均由m位组成,每位上可能有r种不同得符号、?数字分析法根据r种不同得符号及在各位上得分布情况,选取某几位,组合成哈希地址。所选得位应就是各种符号在该位上出现得频率大致相同。 (4)平方取中法?对关键码平方后,按哈希表大小,取中间得若干位作为哈希地址。?(5)折叠法(Folding)?此方法将关键码自左到右分成位数相等得几部分,最后一部分位数可以短些,然后将这几部分叠加求与,并按哈希表表长,取后几位作为哈希地址。这种方法称为折叠法。?有两种叠加方法:?①移位法-—将各部分得最后一位对齐相加。 ②间界叠加法—-从一端向另一端沿各部分分界来回折叠后,最后一位对齐相加。?如对关键码为key=25346358705,设哈希表长为3位数,则可对关键码每3位一部分来分割。关键码分割为如下4组: 253 463 58705 分别用上述方法计算哈希地址如图6—12所示、对于位数很多得关键码,且每一位上符号分布较均匀时,可采用此方法求得哈希地址。

c++常用函数大全

数学函数,所在函数库为math.h、stdlib.h、string.h、float.h int abs(int i) 返回整型参数i的绝对值 double cabs(struct complex znum) 返回复数znum的绝对值 double fabs(double x) 返回双精度参数x的绝对值 long labs(long n) 返回长整型参数n的绝对值 double exp(double x) 返回指数函数ex的值 double frexp(double value,int *eptr) 返回value=x*2n中x的值,n存贮在eptr中double ldexp(double value,int exp); 返回value*2exp的值 double log(double x) 返回logex的值 double log10(double x) 返回log10x的值 double pow(double x,double y) 返回xy的值 double pow10(int p) 返回10p的值 double sqrt(double x) 返回+√x的值 double acos(double x) 返回x的反余弦cos-1(x)值,x为弧度 double asin(double x) 返回x的反正弦sin-1(x)值,x为弧度 double atan(double x) 返回x的反正切tan-1(x)值,x为弧度 double atan2(double y,double x) 返回y/x的反正切tan-1(x)值,y的x为弧度double cos(double x) 返回x的余弦cos(x)值,x为弧度 double sin(double x) 返回x的正弦sin(x)值,x为弧度 double tan(double x) 返回x的正切tan(x)值,x为弧度 double cosh(double x) 返回x的双曲余弦cosh(x)值,x为弧度 double sinh(double x) 返回x的双曲正弦sinh(x)值,x为弧度 double tanh(double x) 返回x的双曲正切tanh(x)值,x为弧度 double hypot(double x,double y) 返回直角三角形斜边的长度(z), x和y为直角边的长度,z2=x2+y2 double ceil(double x) 返回不小于x的最小整数 double floor(double x) 返回不大于x的最大整数 void srand(unsigned seed) 初始化随机数发生器 int rand() 产生一个随机数并返回这个数 double poly(double x,int n,double c[])从参数产生一个多项式 double modf(double value,double *iptr)将双精度数value分解成尾数和阶 double fmod(double x,double y) 返回x/y的余数 double frexp(double value,int *eptr) 将双精度数value分成尾数和阶 double atof(char *nptr) 将字符串nptr转换成浮点数并返回这个浮点数 double atoi(char *nptr) 将字符串nptr转换成整数并返回这个整数 double atol(char *nptr) 将字符串nptr转换成长整数并返回这个整数 char *ecvt(double value,int ndigit,int *decpt,int *sign) 将浮点数value转换成字符串并返回该字符串

api接口文档

API(Application Programming Interface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。API除了有应用“应用程序接口”的意思外,还特指API的说明文档,也称为帮助文档。 API:应用程序接口(API:Application Program Interface) 应用程序接口(是一组定义、程序及协议的集合,通过API 接口实现计算机软件之间的相互通信。API 的一个主要功能是提供通用功能集。程序员通过调用API 函数对应用程序进行开发,可以减轻编程任务。API 同时也是一种中间件,为各种不同平台提供数据共享。 根据单个或分布式平台上不同软件应用程序间的数据共享性能,可以将API 分为四种类型: 远程过程调用(RPC):通过作用在共享数据缓存器上的过程(或任务)实现程序间的通信。 标准查询语言(SQL):是标准的访问数据的查询语言,通过数据库实现应用程序间的数据共享。 文件传输:文件传输通过发送格式化文件实现应用程序间数据共享。

信息交付:指松耦合或紧耦合应用程序间的小型格式化信息,通过程序间的直接通信实现数据共享。 当前应用于API 的标准包括ANSI 标准SQL API。另外还有一些应用于其它类型的标准尚在制定之中。API 可以应用于所有计算机平台和操作系统。这些API 以不同的格式连接数据(如共享数据缓存器、数据库结构、文件框架)。每种数据格式要求以不同的数据命令和参数实现正确的数据通信,但同时也会产生不同类型的错误。因此,除了具备执行数据共享任务所需的知识以外,这些类型的API 还必须解决很多网络参数问题和可能的差错条件,即每个应用程序都必须清楚自身是否有强大的性能支持程序间通信。相反由于这种API 只处理一种信息格式,所以该情形下的信息交付API 只提供较小的命令、网络参数以及差错条件子集。正因为如此,交付API 方式大大降低了系统复杂性,所以当应用程序需要通过多个平台实现数据共享时,采用信息交付API 类型是比较理想的选择。 API 与图形用户接口(GUI)或命令接口有着鲜明的差别:API 接口属于一种操作系统或程序接口,而后两者都属于直接用户接口。 有时公司会将API 作为其公共开放系统。也就是说,公司制定自己的系统接口标准,当需要执行系统整合、自定义和程序应用等操作时,公司所有成员都可以通过该接口标准调用源代码,该接口标准被称之为开放式API。

哈 希 常 见 算 法 及 原 理 ( 2 0 2 0 )

哈希算法乱谈(摘自知乎) 最近【现场实战追-女孩教-学】初步了解了Hash算法的相关知识,一些人的见解让我能够迅速的了解相对不熟悉的知识,故想摘录下来,【QQ】供以后温故而知新。 HASH【⒈】算法是密码学的基础,比较常用的有MD5和SHA,最重要的两【О】条性质,就是不可逆和无冲突。 所谓不【1】可逆,就是当你知道x的HASH值,无法求出x; 所谓无【б】冲突,就是当你知道x,无法求出一个y,使x与y的HA【9】SH值相同。 这两条性【⒌】质在数学上都是不成立的。因为一个函数必然可逆,且【2】由于HASH函数的值域有限,理论上会有无穷多个不同的原始值【6】,它们的hash值都相同。MD5和SHA做到的,是求逆和求冲突在计算上不可能,也就是正向计算很容易,而反向计算即使穷尽人类所有的计算资-源都做不到。 顺便说一下,王小云教授曾经成功制造出MD5的碰撞,即md5(a) = md5(b)。这样的碰撞只能随机生成,并不能根据一个已知的a求出b(即并没有破坏MD5的无冲突特性)。但这已经让他声名大噪了。 HASH算法的另外一个很广泛的用途,就是很多程序员都会使用的在数据库中保存用户密码的算法,通常不会直接保存用户密码(这样DBA就能看到用户密码啦,好危险啊),而是保存密码的HASH值,验

证的时候,用相同的HASH函数计算用户输入的密码得到计算HASH值然后比对数据库中存储的HASH值是否一致,从而完成验证。由于用户的密码的一样的可能性是很高的,防止DBA猜测用户密码,我们还会用一种俗称“撒盐”的过程,就是计算密码的HASH值之前,把密码和另外一个会比较发散的数据拼接,通常我们会用用户创建时间的毫秒部分。这样计算的HASH值不大会都是一样的,会很发散。最后,作为一个老程序员,我会把用户的HASH值保存好,然后把我自己密码的HASH值保存到数据库里面,然后用我自己的密码和其他用户的用户名去登录,然后再改回来解决我看不到用户密码而又要“偷窥”用户的需要。最大的好处是,数据库泄露后,得到用户数据库的黑客看着一大堆HASH值会翻白眼。 哈希算法又称为摘要算法,它可以将任意数据通过一个函数转换成长度固定的数据串(通常用16进制的字符串表示),函数与数据串之间形成一一映射的关系。 举个粒子,我写了一篇小说,摘要是一个string:'关于甲状腺精灵的奇妙冒险',并附上这篇文章的摘要是'2d73d4f15c0db7f5ecb321b6a65e5d6d'。如果有人篡改了我的文章,并发表为'关于JOJO的奇妙冒险',我可以立即发现我的文章被篡改过,因为根据'关于JOJO的奇妙冒险'计算出的摘要不同于原始文章的摘要。 可见,摘要算法就是通过摘要函数f()对任意长度的数据data计算出固定长度的摘要digest,目的是为了发现原始数据是否被人篡

Excel常用的函数计算公式大全

E x c e l常用的函数计算公 式大全 Prepared on 22 November 2020

EXCEL的常用计算公式大全 一、单组数据加减乘除运算: ①单组数据求加和公式:=(A1+B1) 举例:单元格A1:B1区域依次输入了数据10和5,计算:在C1中输入=A1+B1后点击键盘“Enter(确定)”键后,该单元格就自动显示10与5的和 15。 ②单组数据求减差公式:=(A1-B1) 举例:在C1中输入=A1-B1即求10与5的差值5,电脑操作方法同上; ③单组数据求乘法公式:=(A1*B1) 举例:在C1中输入=A1*B1即求10与5的积值50,电脑操作方法同上; ④单组数据求乘法公式:=(A1/B1) 举例:在C1中输入=A1/B1即求10与5的商值2,电脑操作方法同上; ⑤其它应用: 在D1中输入=A1^3即求5的立方(三次方); 在E1中输入=B1^(1/3)即求10的立方根 小结:在单元格输入的含等号的运算式,Excel中称之为公式,都是数学里面的基本运算,只不过在计算机上有的运算符号发生了改变——“×”与“*”同、“÷”与“/”同、“^”与“乘方”相同,开方作为乘方的逆运算,把乘方中和指数使用成分数就成了数的开方运算。这些符号是按住电脑键盘“Shift”键同时按住键盘第二排相对应的数字符号即可显示。如果同一列的其它单元格都需利用刚才的公式计算,只需要先用鼠标左键点击一下刚才已做好公式的单元格,将鼠标移至该单元格的右下角,带出现十字符号提示时,开始按住鼠标左键不动一直沿着该单元格依次往下拉到你需要的某行同一列的单元格下即可,即可完成公司自动复制,自动计算。 二、多组数据加减乘除运算: ①多组数据求加和公式:(常用) 举例说明:=SUM(A1:A10),表示同一列纵向从A1到A10的所有数据相加; =SUM(A1:J1),表示不同列横向从A1到J1的所有第一行数据相加; ②多组数据求乘积公式:(较常用) 举例说明:=PRODUCT(A1:J1)表示不同列从A1到J1的所有第一行数据相乘; =PRODUCT(A1:A10)表示同列从A1到A10的所有的该列数据相乘; ③多组数据求相减公式:(很少用) 举例说明:=A1-SUM(A2:A10)表示同一列纵向从A1到A10的所有该列数据相减; =A1-SUM(B1:J1)表示不同列横向从A1到J1的所有第一行数据相减; ④多组数据求除商公式:(极少用)

常用API

转:OpenGL API 简介 开发基于OpenGL的应用程序,必须先了解OpenGL的库函数。它采用C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有 OpenGL函数采用了以下格式: <库前缀><根命令><可选的参数个数><可选的参数类型> 库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库,从函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如glVertex3fv()表示了该函数属于gl 库,参数是三个float型参数指针。我们用glVertex*() 来表示这一类函数。 OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图可以看出,gl是核心,glu是对gl的部分封装。 glx、agl、wgl 是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。下面逐一对这些库进行详细介绍。 1.OpenGL核心库 核心库包含有115个函数,函数名的前缀为gl。这部分函数用于常规的、核心的图形处理。此函数由gl.dll来负责解释执行。由于许多函数可以接收不同数以下几类。据类型的参数,因此派生出来的函数原形多达300多个。核心库中的函数主要可以分为以下几类函数: ?绘制基本几何图元的函数:glBegain()、glEnd()、glNormal*()、glVertex*(); ?矩阵操作、几何变换和投影变换的函数:如矩阵入栈函数glPushMatrix(),矩阵出栈函数glPopMatrix(),装载矩阵函数glLoadMatrix(),矩阵相乘函数glMultMatrix(),当前矩阵函数glMatrixMode()和矩阵标准化函数glLoadIdentity(),几何变换函数glTranslate*()、glRotate*()和glScale*(),投影变换函数glOrtho()、glFrustum()和视口变换函数glViewport();?颜色、光照和材质的函数:如设置颜色模式函数glColor*()、glIndex*(),设置光照效果的函数glLight*() 、glLightModel*()和设置材质效果函数glMaterial(); ?显示列表函数:主要有创建、结束、生成、删除和调用显示列表的函数glNewList()、glEndList()、glGenLists()、glCallList()和glDeleteLists(); ?纹理映射函数:主要有一维纹理函数glTexImage1D()、二维纹理函数glTexImage2D()、设置纹理参数、纹理环境和纹理坐标的函数glTexParameter*()、 glTexEnv*()和glTetCoord*(); ?特殊效果函数:融合函数glBlendFunc()、反走样函数glHint()和雾化效果glFog*();?光栅化、象素操作函数:如象素位置glRasterPos*()、线型宽度glLineWidth()、多边形绘制模式glPolygonMode(),读取象素glReadPixel()、复制象素glCopyPixel(); ?选择与反馈函数:主要有渲染模式glRenderMode()、选择缓冲区glSelectBuffer()和反馈缓冲区glFeedbackBuffer(); ?曲线与曲面的绘制函数:生成曲线或曲面的函数glMap*()、glMapGrid*(),求值器的函数glEvalCoord*() glEvalMesh*(); ?状态设置与查询函数:glGet*()、glEnable()、glGetError()。 2.OpenGL实用库The OpenGL Utility Library (GLU) 包含有43个函数,函数名的前缀为glu。OpenGL提供了强大的但是为数不多的绘图命令,所有较复杂的绘图都必须从点、线、面开始。Glu 为了减轻繁重的编程工作,封装了OpenGL函数,Glu函数通过调用核心库的函数,为开发者提供相对简单的用法,实现

相关文档