扫描代码

合集下载

键盘扫描码

键盘扫描码

键盘上的每一个键都有两个唯一的数值进行标志。

为什么要用两个数值而不是一个数值呢?这是因为一个键可以被按下,也可以被释放。

当一个键按下时,它们产生一个唯一的数值,当一个键被释放时,它也会产生一个唯一的数值,我们把这些数值都保存在一张表里面,到时候通过查表就可以知道是哪一个键被敲击,并且可以知道是它是被按下还是被释放了。

这些数值在系统中被称为键盘扫描码2扫描码大全扫描码键0x011b ESC0x3b00 F10x3c00 F20x3d00 F30x3e00 F40x3f00 F50x4000 F60x4100 F70x4200 F80x4300 F90x4400 F10主键盘区:0x2960 ~0x0231 10x0332 20x0433 30x0534 40x0635 50x0736 60x0837 70x0938 80x0a39 90x0b30 00x0c2d -0x0d3d =0x2b5c \0x0e08 退格键0x0f09 Tab0x1071 q0x1177 w0x1265 e0x1372 r0x1474 t0x1579 y0x1769 i0x186f o0x1970 p0x1a5b [0x1b5d ]0x1e61 a0x1f73 s0x2064 d0x2166 f0x2267 g0x2368 h0x246a j0x256b k0x266c l0x273b ;0x2827 '0x1c0d 回车0x2c7a z0x2d78 x0x2e63 c0x2f76 v0x3062 b0x316e n0x326d m0x332c ,0x342e .0x352f /0x3920 空格键0xe05b 左Win0xe05c 右Win0xe05d Menu右边数字键盘:0x5200 Insert0x4700 Home0x4900 Page UP 0x5300 Delete0x4f00 End0x5100 PageDown 0x4800 上箭头0x4b00 左箭头0x5000 下箭头0x4d00 右箭头0x352f /0x4a2d - (注意,这是数字键盘的)0x4737 70x4838 80x4939 90x4b34 40x4c35 50x4d36 60x4e2b +0x4f31 10x5032 20x5133 30x5230 00x532e Del通过PC机键盘输入汉字时,其中经过多次的代码转换:用户---汉字输入码---键盘---键盘扫描码---BIOS键盘驱动程序----ASCII码----汉字输入软件----汉字内码。

键盘扫描码key_code

键盘扫描码key_code

键盘扫描码Keyboard Scan Codes (Numerical Order)---------------+---------------+---------------+---------------+---------------HEX DEC keys |HEX DEC keys |HEX DEC keys |HEX DEC keys |HEXDEC keys---------------+---------------+---------------+---------------+---------------|10 16 Q |20 32 D |30 48 B |4064 F601 1 ESC |11 17 W |21 33 F |31 49 N |4165 F702 2 1 |12 18 E |22 34 G |32 50 M |4266 F803 3 2 |13 19 R |23 35 H |33 51 , |4367 F904 4 3 |14 20 T |24 36 J |34 52 . |4468 F1005 5 4 |15 21 Y |25 37 K |35 53 / |4569 Num06 6 5 |16 22 U |26 38 L |36 54 RShift|46 70 Scroll07 7 6 |17 23 I |27 39 ; |37 55 PrtSc |4771 Home08 8 7 |18 24 O |28 40 ' |38 56 Alt |4872 Up09 9 8 |19 25 P |29 41 ` |39 57 Space |4973 PgUp0A 10 9 |1A 26 [ |2A 42 LShift|3A 58 Caps |4A 74 -0B 11 0 |1B 27 ] |2B 43 \ |3B 59 F1 |4B75 Left0C 12 - |1C 28 |2C 44 Z |3C 60 F2 |4C76 Center0D 13 = |1D 29 CTRL |2D 45 X |3D 61 F3 |4D77 Right0E 14 bs |1E 30 A |2E 46 C |3E 62 F4 |4E78 +0F 15 Tab |1F 31 S |2F 47 V |3F 63 F5 |4F79 End---------------+---------------+---------------+---------------+---------------50 80 Down | | | |51 81 PgDn | | | |52 82 Ins | | | |53 83 Del | | | | ---------------+---------------+---------------+---------------+---------------Keyboard Scan Codes (Read from Port HEX 60 = DEC 96) (Keyboard Layout)Top number ... DECBottom number ... HEX+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+|F1|F2|ESC| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 0 | - | = |BkS|NumLok|Scr Lok|| | | | | | | | | | | | | | | | || ||59|60| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |10 |11 |12 |13 |14 | 69 | 70 | |3B|3C|01 |02 |03 |04 |05 |06 |07 |08 |09 |0A |0B |0C |0D |0E| 45 | 46 |+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+|F3|F4|TAB| Q | W | E | R | T | Y | U | I | O | P | [ | ] | | 7 38 | 9 3 - || | | | | | | | | | | | | | | | | 3| 3 ||61|62|15 |16 |17 |18 |19 |20 |21 |22 |23 |24 |25 |26 |27 | |71 372|73 374 ||3D|3E|0F |10 |11 |12 |13 |14 |15 |16 |17 |18 |19 |1A |1B | |47 348|49 34A |+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+|F5|F6|CTR| A | S | D | F | G | H | J | K | L | ; | ' | ` |28 | 4 35 |6 3 || | | | | | | | | | | | | | | | | 3| 3 ||63|64|29 |30 |31 |32 |33 |34 |35 |36 |37 |38 |39 |40 |41 | |75 376|77 3 ||3F|40|1D |1E |1F |20 |21 |22 |23 |24 |25 |26 |27 |28 |29 | |4B 34C|4D 3 |+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+|F7|F8|Shf| \ | Z | X | C | V | B | N | M | , | . | / |Shf|Prt| 1 32 |3 3 + || | | | | | | | | | | | | | | | | 3| 3 ||65|66|42 |43 |44 |45 |46 |47 |48 |49 |50 |51 |52 |53 |54 |55 |78 380|81 378 ||41|42|2A |2B |2C |2D |2E |2F |30 |31 |32 |33 |34 |35 |36 |37 |4F 350|51 34E |+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+|F9|F0| A|t | | | | |pac| | | | |Cap|Lok| I|s 3D|l 3 || | | | | | | | | | | | | | | | | 3| 3 ||67|68| 5| | | | | |57| | | | | 5| | 8| 3 8| 3 ||43|44| 3| | | | | |39| | | | | 3| | 5| 3 5| 3 |+--+--+---+---+---+---+---+---+---+---+---+---+---+---+---+---+-------+-------+Extended ASCII Special Key Codes (Numerical Order)... composed of 2 bytes, the 2nd byte being 00 (00 signifies that the special codes are to be applied.)HEX DEC keys-------------------------------03 3 CTRL-2; same as CHR$(0)0F 15 Shift-tab10 16 Alt-Q11 17 Alt-W12 18 Alt-E13 19 Alt-R14 20 Alt-T15 21 Alt-Y16 22 Alt-U17 23 Alt-I18 24 Alt-O19 25 Alt-P1E 30 Alt-A1F 31 Alt-S20 32 Alt-D21 33 Alt-F22 34 Alt-G23 35 Alt-H24 36 Alt-J25 37 Alt-K26 38 Alt-L2C 44 Alt-Z2D 45 Alt-X2E 46 Alt-C2F 47 Alt-V30 48 Alt-B31 49 Alt-N32 50 Alt-M3B 59 F13C 60 F23D 61 F33E 62 F43F 63 F540 64 F641 65 F742 66 F843 67 F944 68 F1047 71 Home48 72 Up49 73 PgUp4B 75 Left4D 77 Right4F 79 End50 80 Down51 81 PgDn52 82 Ins53 83 Del54 84 Shift-F155 85 Shift-F256 86 Shift-F357 87 Shift-F458 88 Shift-F559 89 Shift-F6 5A 90 Shift-F7 5B 91 Shift-F8 5C 92 Shift-F9 5D 93 Shift-F105F 95 Ctrl-F260 96 Ctrl-F361 97 Ctrl-F462 98 Ctrl-F563 99 Ctrl-F664 100 Ctrl-F765 101 Ctrl-F866 102 Ctrl-F967 103 Ctrl-F1068 104 Alt-F169 105 Alt-F26A 106 Alt-F36B 107 Alt-F46C 108 Alt-F56D 109 Alt-F66E 110 Alt-F76F 111 Alt-F870 112 Alt-F971 113 Alt-F1072 114 Ctrl-PrtSc73 115 Ctrl-Left74 116 Ctrl-Right75 117 Ctrl-End76 118 Ctrl-PgDn77 119 Ctrl-Home78 120 Alt-179 121 Alt-27A 122 Alt-37B 123 Alt-47C 124 Alt-57D 125 Alt-67E 126 Alt-77F 127 Alt-880 128 Alt-981 129 Alt-082 130 Alt--83 131 Alt-=84 132 Ctrl-PgUp85 133 Ctrl-Up86 134 Ctrl--(num)87 135 Ctrl-Center88 136 Ctrl-+(num)89 137 Ctrl-Down8B 139 Ctrl-Del8C 140 Alt-Home8D 141 Alt-Up8E 142 Alt-PgUp8F 143 Alt--(num)90 144 Alt-Left91 145 Alt-Center92 146 Alt-Right93 147 Alt-+(num)94 148 Alt-End95 149 Alt-Down96 150 Alt-PgDn97 151 Alt-Ins98 152 Alt-DelExtended ASCII Special Key Codes (Keyboard Layout)------------------+-------------------+-------------------+--------------------HEX DEC keys | HEX DEC keys | HEX DEC keys | HEX DECkeys------------------+-------------------+-------------------+--------------------03 3 nul | 0F 15 Shift-tab | 72 114 Ctrl-PrtSc|------------------+-------------------+-------------------+--------------------47 71 Home | | 77 119 Ctrl-Home | 8C140 Alt-Home48 72 Up | | 85 133 Ctrl-Up | 8D141 Alt-Up49 73 PgUp | | 84 132 Ctrl-PgUp | 8E142 Alt-PgUp4A 74 -(num) | | 86 134 Ctrl--(nu)| 8F143 Alt--(num)4B 75 Left | | 73 115 Ctrl-Left | 90144 Alt-Left4C 76 Center | | 87 135 Ctrl-Centr| 91145 Alt-Center4D 77 Right | | 74 116 Ctrl-Right| 92146 Alt-Right4E 78 +(num) | | 88 136 Ctrl-+(nu)| 93147 Alt-+(num)4F 79 End | | 75 117 Ctrl-End | 94148 Alt-End50 80 Down | | 89 137 Ctrl-Down | 95149 Alt-Down51 81 PgDn | | 76 118 Ctrl-PgDn | 96150 Alt-PgDn52 82 Ins | | 8A 138 Ctrl-Ins | 97151 Alt-Ins53 83 Del | | 8B 139 Ctrl-Del | 98152 Alt-Del------------------+-------------------+-------------------+--------------------3B 59 F1 | 54 84 Shift-F1 | 5E 94 Ctrl-F1 | 68104 Alt-F13C 60 F2 | 55 85 Shift-F2 | 5F 95 Ctrl-F2 | 69105 Alt-F23D 61 F3 | 56 86 Shift-F3 | 60 96 Ctrl-F3 | 6A106 Alt-F33E 62 F4 | 57 87 Shift-F4 | 61 97 Ctrl-F4 | 6B107 Alt-F43F 63 F5 | 58 88 Shift-F5 | 62 98 Ctrl-F5 | 6C108 Alt-F540 64 F6 | 59 89 Shift-F6 | 63 99 Ctrl-F6 | 6D109 Alt-F641 65 F7 | 5A 90 Shift-F7 | 64 100 Ctrl-F7 | 6E110 Alt-F742 66 F8 | 5B 91 Shift-F8 | 65 101 Ctrl-F8 | 6F111 Alt-F843 67 F9 | 5C 92 Shift-F9 | 66 102 Ctrl-F9 | 70112 Alt-F944 68 F10 | 5D 93 Shift-F10 | 67 103 Ctrl-F10 | 71113 Alt-F10------------------+-------------------+-------------------+--------------------1E 30 Alt-A | 31 49 Alt-N | 78 120 Alt-1 |30 48 Alt-B | 18 24 Alt-O | 79 121 Alt-2 |2E 46 Alt-C | 19 25 Alt-P | 7A 122 Alt-3 |20 32 Alt-D | 10 16 Alt-Q | 7B 123 Alt-4 |12 18 Alt-E | 13 19 Alt-R | 7C 124 Alt-5 |21 33 Alt-F | 1F 31 Alt-S | 7D 125 Alt-6 |22 34 Alt-G | 14 20 Alt-T | 7E 126 Alt-7 |23 35 Alt-H | 16 22 Alt-U | 7F 127 Alt-8 |17 23 Alt-I | 2F 47 Alt-V | 80 128 Alt-9 |24 36 Alt-J | 11 17 Alt-W | 81 129 Alt-0 |25 37 Alt-K | 2D 45 Alt-X | 82 130 Alt-- |26 38 Alt-L | 15 21 Alt-Y | 83 131 Alt-= |32 50 Alt-M | 2C 44 Alt-Z |PC机和键盘部分通信命令字PC机向键盘发出的命令共有10条,键盘向PC机发出的键盘响应共有7条。

SYN扫描源代码

SYN扫描源代码

下面是一个网络编程的实例, Syn扫描器代码,可以作为参考.基本可以看为是ping命令的实现//getallIP.cpp#include <winsock2.h>#include <stdio.h>#pragma comment(lib,"ws2_32.lib")int main(){////////////////// 初始化Windows sockets API.//WORD wVersionRequested = MAKEWORD(2, 2);WSADATA wsaData;if (WSAStartup(wVersionRequested, &wsaData)) {printf("WSAStartup failed %s\n", WSAGetLastError());return 0;}//////////////////// 获得主机名.//char hostname[256];int res = gethostname(hostname, sizeof(hostname));if (res != 0) {printf("Error: %u\n", WSAGetLastError());return 0;}printf("hostname=%s\n", hostname);////////////////// 根据主机名获取主机信息.//hostent* pHostent = gethostbyname(hostname);if (pHostent==NULL) {printf("Error: %u\n", WSAGetLastError());return 0;}//////////////////// 解析返回的hostent信息.//hostent& he = *pHostent;printf("name=%s\naliases=%s\naddrtype=%d\nlength=%d\n", he.h_name, he.h_aliases, he.h_addrtype, he.h_length);sockaddr_in sa;//根据he.h_addr_list[nAdapter]是否为空来获取所有IP地址for (int nAdapter=0; he.h_addr_list[nAdapter]; nAdapter++) {memcpy ( &sa.sin_addr.s_addr, he.h_addr_list[nAdapter],he.h_length);// 输出机器的IP地址.printf("Address [%d%]: %s\n",nAdapter, inet_ntoa(sa.sin_addr)); // 显示地址串}//////////////////// 终止Windows sockets API//WSACleanup();return 0;}//mstcpip.h//头文件// Copyright (C) Microsoft Corporation, 1996-1999#if _MSC_VER > 1000#pragma once#endif/* Argument structure for SIO_KEEPALIVE_VALS */struct tcp_keepalive {u_long onoff;u_long keepalivetime;u_long keepaliveinterval;};// New WSAIoctl Options#define SIO_RCVALL _WSAIOW(IOC_VENDOR,1)#define SIO_RCVALL_MCAST _WSAIOW(IOC_VENDOR,2)#define SIO_RCVALL_IGMPMCAST _WSAIOW(IOC_VENDOR,3)#define SIO_KEEPALIVE_VALS _WSAIOW(IOC_VENDOR,4)#define SIO_ABSORB_RTRALERT _WSAIOW(IOC_VENDOR,5)#define SIO_UCAST_IF _WSAIOW(IOC_VENDOR,6)#define SIO_LIMIT_BROADCASTS _WSAIOW(IOC_VENDOR,7) #define SIO_INDEX_BIND _WSAIOW(IOC_VENDOR,8)#define SIO_INDEX_MCASTIF _WSAIOW(IOC_VENDOR,9)#define SIO_INDEX_ADD_MCAST _WSAIOW(IOC_VENDOR,10) #define SIO_INDEX_DEL_MCAST _WSAIOW(IOC_VENDOR,11)//主程序//synscan.cpp#include <winsock2.h>#include <ws2tcpip.h>#include <stdio.h>#include <time.h>#include "mstcpip.h"#pragma comment(lib,"ws2_32.lib")#define SEQ 0x28376839SOCKET sockRaw = INVALID_SOCKET,sockListen = INVALID_SOCKET;struct sockaddr_in dest;BOOL ScanOK=FALSE;char *DEST_HOST;int DEST_PORT;int DEST_PORTEND;int play=0;clock_t start,end;//程序运行的起始和结束时间float costtime;//程序耗时typedef struct _iphdr{unsigned char h_lenver; //4位首部长度+4位IP版本号unsigned char tos; //8位服务类型TOSunsigned short total_len; //16位总长度(字节)unsigned short ident; //16位标识unsigned short frag_and_flags; //3位标志位unsigned char ttl; //8位生存时间TTLunsigned char proto; //8位协议(TCP, UDP 或其他) unsigned short checksum; //16位IP首部校验和unsigned int sourceIP; //32位源IP地址unsigned int destIP; //32位目的IP地址}IP_HEADER;typedef struct _tcphdr //定义TCP首部{USHORT th_sport; //16位源端口USHORT th_dport; //16位目的端口unsigned int th_seq; //32位序列号unsigned int th_ack; //32位确认号unsigned char th_lenres; //4位首部长度/6位保留字unsigned char th_flag; //6位标志位USHORT th_win; //16位窗口大小USHORT th_sum; //16位校验和USHORT th_urp; //16位紧急数据偏移量}TCP_HEADER;struct //定义TCP伪首部{unsigned long saddr; //源地址unsigned long daddr; //目的地址char mbz;char ptcl; //协议类型unsigned short tcpl; //TCP长度}psd_header;//SOCK错误处理程序void CheckSockError(int iErrorCode, char *pErrorMsg) {if(iErrorCode==SOCKET_ERROR){printf("%s Error:%d\n", pErrorMsg, GetLastError()); closesocket(sockRaw);ExitProcess(-1);}}//计算检验和USHORT checksum(USHORT *buffer, int size){unsigned long cksum=0;while (size > 1){cksum += *buffer++;size -= sizeof(USHORT);}if (size){cksum += *(UCHAR*)buffer;}cksum = (cksum >> 16) + (cksum & 0xffff);cksum += (cksum >>16);return (USHORT)(~cksum);}//IP解包程序bool DecodeIPHeader(char *buf, int bytes){IP_HEADER *iphdr;TCP_HEADER *tcphdr;unsigned short iphdrlen;iphdr = (IP_HEADER *)buf;iphdrlen = sizeof(unsigned long) * (iphdr->h_lenver & 0xf);tcphdr = (TCP_HEADER*)(buf + iphdrlen);//是否来自目标IPif(iphdr->sourceIP != dest.sin_addr.s_addr)return false;//序列号是否正确if((ntohl(tcphdr->th_ack) != (SEQ+1)) && (ntohl(tcphdr->th_ack) != SEQ)) return false;//if(tcphdr->th_flag == 20)return true;//SYN/ACK - 扫描到一个端口if(tcphdr ->th_flag == 18){printf("\t%d\t open \n",ntohs(tcphdr->th_sport));return true;}return true;}void usage(void){printf("\t===================SYN portscaner======================\n");printf("\t============ 2004/7/6===========\n");printf("\tusage: synscan DomainName[IP] StartPort-EndPort\n");printf("\tExample: synscan 1-139\n");printf("\tExample: synscan 192.168.1.1 8000-9000\n");}DWORD WINAPI RecvThread(LPVOID para)//接收数据线程函数{int iErrorCode;struct hostent *hp;char RecvBuf[65535]={0};sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//设置SOCK_RAW为SIO_RCVALL,以便接收所有的IP包DWORD dwBufferLen[10] ;DWORD dwBufferInLen = 1 ;DWORD dwBytesReturned = 0 ;iErrorCode=WSAIoctl(sockListen, SIO_RCVALL,&dwBufferInLen, sizeof(dwBufferInLen),&dwBufferLen, sizeof(dwBufferLen),&dwBytesReturned , NULL , NULL ); CheckSockError(iErrorCode, "Ioctl");memset(RecvBuf, 0, sizeof(RecvBuf));//接收数据for(;;){iErrorCode = recv(sockListen, RecvBuf, sizeof(RecvBuf), 0);//CheckSockError(iErrorCode, "recv");DecodeIPHeader(RecvBuf,iErrorCode) ;}if(ScanOK){closesocket(sockListen);return 0;}}void playx(void) // 定义状态提示函数{// 进度条char *plays[12]={" | "," / "," - "," \\ "," | "," / "," - "," \\ "," | "," / "," - "," \\ ",};printf(" =%s=\r", plays[play]);play=(play==11)?0:play+1;Sleep(2);}//主函数int main(int argc,char **argv){char *p;if(argc!=3){usage();return 0;}p=argv[2];//处理端口参数if(strstr(argv[2],"-")){ DEST_PORT=atoi(argv[2]);for(;*p;)if(*(p++)=='-')break;DEST_PORTEND=atoi(p);if(DEST_PORT<1 || DEST_PORTEND>65535){ printf("Port Error!\n");return 0;}}DEST_HOST=argv[1];usage();int iErrorCode;int datasize;struct hostent *hp;IP_HEADER ip_header;TCP_HEADER tcp_header;char SendBuf[128]={0};//初始化SOCKETWSADATA wsaData;iErrorCode = WSAStartup(MAKEWORD(2,2),&wsaData);CheckSockError(iErrorCode, "WSAStartup()");sockRaw = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockRaw, "socket()");sockListen = socket(AF_INET , SOCK_RAW , IPPROTO_IP);CheckSockError(sockListen, "socket");//设置IP头操作选项BOOL bOpt = true;iErrorCode = setsockopt(sockRaw,IPPROTO_IP,IP_HDRINCL,(char *)&bOpt,sizeof(bOpt));CheckSockError(iErrorCode, "setsockopt()");//获得本地IPSOCKADDR_IN sa;unsigned char LocalName[256];iErrorCode = gethostname((char*)LocalName,sizeof(LocalName)-1);CheckSockError(iErrorCode, "gethostname()");if((hp = gethostbyname((char*)LocalName)) == NULL){CheckSockError(SOCKET_ERROR, "gethostbyname()");}memcpy(&sa.sin_addr.S_un.S_addr,hp->h_addr_list[1],hp->h_length);sa.sin_family = AF_INET;sa.sin_port = htons(7000);iErrorCode = bind(sockListen, (PSOCKADDR)&sa, sizeof(sa));CheckSockError(iErrorCode, "bind");//获得目标主机IPmemset(&dest,0,sizeof(dest));dest.sin_family = AF_INET;dest.sin_port = htons(DEST_PORT);if((dest.sin_addr.s_addr = inet_addr(DEST_HOST)) == INADDR_NONE){if((hp = gethostbyname(DEST_HOST)) != NULL){memcpy(&(dest.sin_addr),hp->h_addr_list[1],hp->h_length);dest.sin_family = hp->h_addrtype;printf("dest.sin_addr = %s\n",inet_ntoa(dest.sin_addr));}else{CheckSockError(SOCKET_ERROR, "gethostbyname()");}}//开启监听线程HANDLE Thread=CreateThread(NULL,0,RecvThread,0,0,0);//填充IP首部ip_header.h_lenver=(4<<4 | sizeof(ip_header)/sizeof(unsigned long));//高四位IP版本号,低四位首部长度ip_header.total_len=htons(sizeof(IP_HEADER)+sizeof(TCP_HEADER)); //16位总长度(字节)ip_header.ident=1; //16位标识ip_header.frag_and_flags=0; //3位标志位ip_header.ttl=128; //8位生存时间TTLip_header.proto=IPPROTO_TCP; //8位协议(TCP,UDP…)ip_header.checksum=0; //16位IP首部校验和ip_header.sourceIP=sa.sin_addr.s_addr; //32位源IP地址ip_header.destIP=dest.sin_addr.s_addr; //32位目的IP地址//填充TCP首部tcp_header.th_sport=htons(7000); //源端口号tcp_header.th_lenres=(sizeof(TCP_HEADER)/4<<4|0); //TCP长度和保留位tcp_header.th_win=htons(16384);//填充TCP伪首部(用于计算校验和,并不真正发送)psd_header.saddr=ip_header.sourceIP;psd_header.daddr=ip_header.destIP;psd_header.mbz=0;psd_header.ptcl=IPPROTO_TCP;psd_header.tcpl=htons(sizeof(tcp_header));Sleep(500);printf("\n");printf("Scaning %s\n",DEST_HOST);start=clock();//开始计时for(;DEST_PORT<DEST_PORTEND;DEST_PORT++){playx();tcp_header.th_dport=htons(DEST_PORT); //目的端口号tcp_header.th_ack=0; //ACK序列号置为0tcp_header.th_flag=2; //SYN 标志tcp_header.th_seq=htonl(SEQ); //SYN序列号tcp_header.th_urp=0; //偏移tcp_header.th_sum=0; //校验和//计算TCP校验和,计算校验和时需要包括TCP pseudo header memcpy(SendBuf,&psd_header,sizeof(psd_header));memcpy(SendBuf+sizeof(psd_header),&tcp_header,sizeof(tcp_header)); tcp_header.th_sum=checksum((USHORT*)SendBuf,sizeof(psd_header)+sizeof(tcp_header));//计算IP校验和memcpy(SendBuf,&ip_header,sizeof(ip_header));memcpy(SendBuf+sizeof(ip_header),&tcp_header,sizeof(tcp_header)); memset(SendBuf+sizeof(ip_header)+sizeof(tcp_header),0,4);datasize=sizeof(ip_header)+sizeof(tcp_header);ip_header.checksum=checksum((USHORT *)SendBuf,datasize);//填充发送缓冲区memcpy(SendBuf,&ip_header,sizeof(ip_header));//发送TCP报文iErrorCode=sendto(sockRaw,SendBuf,datasize,0,(struct sockaddr*) &dest, sizeof(dest));CheckSockError(iErrorCode, "sendto()");}end=clock();//计时结束ScanOK=TRUE;printf("Closeing Thread.....\n");WaitForSingleObject(Thread,5000);CloseHandle(Thread);costtime= (float)(end - start) / CLOCKS_PER_SEC; //转换时间格式printf("Cost time:%f Sec",costtime);//显示耗时//退出前清理if(sockRaw != INVALID_SOCKET) closesocket(sockRaw);WSACleanup();re turn 0;}。

代码扫描问题以及解决方式(转载备忘)

代码扫描问题以及解决方式(转载备忘)

代码扫描问题以及解决⽅式(转载备忘)1、LI_LAZY_INIT_UPDATE_STATIC:Incorrect lazy initialization and update of static fieldThismethod contains an unsynchronized lazy initialization of a static field. Afterthe field is set, the object stored into that location is further updated oraccessed. The setting of the field is visible to other threads as soon as it isset. If the futher accesses in the method that set the field serve toinitialize the object, then you have a veryseriousmultithreading bug, unless something else prevents any otherthread from accessing the stored object until it is fully initialized.原因分析:该⽅法的初始化中包含了⼀个迟缓初始化的静态变量。

你的⽅法引⽤了⼀个静态变量,估计是类静态变量,那么多线程调⽤这个⽅法时,你的变量就会⾯临线程安全的问题了,除⾮别的东西阻⽌任何其他线程访问存储对象从直到它完全被初始化。

解决⽅法:给该⽅法加上synchronized同步锁,并且给有调⽤到该静态变量的⽅法也加上synchronized同步锁。

2、RR_NOT_CHECKED: Method ignores results ofInputStream.read()This method ignores the return value ofone of the variants of java.io.InputStream.read() which can returnmultiple bytes. If the return value is not checked, the caller will notbe able to correctly handle the case where fewer bytes were read than thecaller requested. This is a particularly insidious kind of bug, becausein many programs, reads from input streams usually do read the full amount ofdata requested, causing the program to fail only sporadically.原因分析:InputStream.read⽅法忽略返回的多个字符,如果对结果没有检查就没法正确处理⽤户读取少量字符请求的情况。

二维码扫描代码

二维码扫描代码

downView.backgroundColor = [[UIColorblackColor]colorWithAlphaComponent:TINTCOLOR_ ALPHA];
[_scanViewaddSubview:downView];
//用于说明的label UILabel *labIntroudction= [[UILabelalloc]init]; labIntroudction.backgroundColor = [UIColorclearColor]; labIntroudction.frame=CGRectMake(0,5,VIEW_WIDTH,20 ); labIntroudction.numberOfLines=1; labIntroudction.font=[UIFontsystemFontOfSize:15.0]; labIntroudction.textAlignment=NSTextAlignmentCenter; labIntroudction.textColor=[UIColorwhiteColor]; labIntroudction.text=@"将二维码对准方框,即可自动扫 描"; [downViewaddSubview:labIntroudction];
UIView *darkView = [[UIViewalloc]initWithFrame:CGRectMake(0, downView.frame.size.height-100.0,VIEW_WIDTH,100.0)];
darkView.backgroundColor = [[UIColorblackColor] colorWithAlphaComponent:DARKCOLOR _ALPHA];

如何进行有效的代码扫描

如何进行有效的代码扫描

如何进行有效的代码扫描代码扫描是一种帮助开发人员检测代码中存在的潜在漏洞以及安全漏洞的技术。

在现代软件开发中,代码扫描已经成为了非常必要的一项工作。

但是代码扫描并不是简单的运行一些扫描工具,而是需要开发人员对扫描工具、扫描规则等等进行了解,并且掌握一些扫描技巧和策略。

本文将介绍如何进行有效的代码扫描,以帮助开发人员提高代码的安全性和可靠性。

1.了解不同类型的扫描工具在进行代码扫描之前,开发人员首先要了解不同类型的扫描工具。

常见的扫描工具包括静态检查、动态检查和黑盒测试。

静态检查是指在编译前对源代码进行扫描,以检测代码中存在的潜在漏洞和安全漏洞。

动态检查是运行时对代码进行扫描,以检测代码中存在的漏洞和安全漏洞。

黑盒测试是指通过模拟攻击者对应用程序进行测试,以发现应用程序的漏洞和安全漏洞。

了解不同类型的扫描工具可以帮助开发人员选择合适的扫描工具,并且准确地进行扫描。

2.选择合适的扫描规则在进行代码扫描之前,开发人员还需要选择合适的扫描规则。

扫描规则是根据编程语言和编程规范编写的,它可以帮助扫描工具更准确地检测代码中存在的漏洞和安全漏洞。

但是在选择扫描规则时,开发人员需要根据自己的项目需求和实际情况进行选择。

如果选择的规则过于严格,那么可能会产生误报,造成不必要的麻烦。

而如果选择的规则过于宽松,那么可能会漏掉一些潜在的漏洞和安全漏洞。

因此选择合适的扫描规则是非常重要的一步。

3.针对性的进行扫描在进行代码扫描时,开发人员还需要针对性地进行扫描。

不同的应用程序具有不同的特点,这也决定了扫描的内容和方法。

一般来说,我们可以针对性地进行扫描,从而减少扫描时间和提高扫描效率。

例如,如果我们只需要扫描网站的登录功能,那么我们可以只针对这一部分的代码进行扫描,从而节省扫描时间。

而如果我们需要对整个应用程序进行扫描,那么我们需要将扫描工具的范围设置为整个应用程序。

这样可以确保扫描的准确性和完整性。

4.定期检查代码最后,开发人员还需要定期检查代码。

代码扫描的要求和标准

代码扫描的要求和标准

代码扫描的要求和标准
代码扫描是一种对代码进行审查和检测的过程,旨在发现潜在的问题、漏洞和不符合规范的地方。

在进行代码扫描时,通常需要遵循一些要求和标准,以确保扫描的准确性和可靠性。

以下是一些常见的代码扫描要求和标准:
1. 完整性:确保扫描覆盖了所有的代码,包括源代码、库、依赖项等,以便发现所有潜在的问题。

2. 准确性:代码扫描应该准确地检测出代码中的问题,避免误报或漏报。

同时,应该提供详细的信息,以便开发人员能够理解问题的性质和影响。

3. 高效性:代码扫描应该快速且高效,以便能够在短时间内对大量代码进行审查。

这通常需要采用一些优化技术,例如并行扫描、过滤不必要的文件等。

4. 可定制性:由于不同的项目可能有不同的需求和规范,因此代码扫描工具应该能够根据需要进行定制,以便满足特定项目的需求。

5. 标准化:代码扫描应该遵循通用的标准和规范,以确保检测的准确性和一致性。

例如,OWASP Top 10、CWE等都是常见的安全漏洞标准。

6. 可读性:扫描结果应该易于阅读和理解,以便开发人员能够快速定位和修复问题。

结果应该提供清晰的描述和解决方案,以便开发人员能够快速了解问题的性质和修复方法。

7. 可靠性:代码扫描工具应该具有高可靠性,以确保在各种情况下都能够准确地检测出问题。

同时,工具应该具备自我修复和自我学习能力,以便不断提高检测的准确性和可靠性。

总之,代码扫描是一项重要的代码审查技术,可以帮助开发人员发现潜在的问题和漏洞,提高代码的质量和安全性。

在进行代码扫描时,应该遵循上述要求和标准,以确保扫描的准确性和可靠性。

4种代码扫描工具分析

4种代码扫描工具分析

简介本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

引言在Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。

Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。

目前市场上的Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

静态代码分析工具简介什么是静态代码分析静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。

在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。

统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。

静态代码分析工具的优势1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。

分析四种代码扫描工具

分析四种代码扫描工具

简介本文首先介绍了静态代码分析的基本概念及主要技术,随后分别介绍了现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

引言在Java 软件开发过程中,开发团队往往要花费大量的时间和精力发现并修改代码缺陷。

Java 静态代码分析(static code analysis)工具能够在代码构建过程中帮助开发人员快速、有效的定位代码缺陷并及时纠正这些问题,从而极大地提高软件可靠性并节省软件开发和测试成本。

目前市场上的Java 静态代码分析工具种类繁多且各有千秋,因此本文将分别介绍现有4 种主流Java 静态代码分析工具(Checkstyle,FindBugs,PMD,Jtest),并从功能、特性等方面对它们进行分析和比较,希望能够帮助Java 软件开发人员了解静态代码分析工具,并选择合适的工具应用到软件开发中。

静态代码分析工具简介什么是静态代码分析静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误和缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针引用等等。

在软件开发过程中,静态代码分析往往先于动态测试之前进行,同时也可以作为制定动态测试用例的参考。

统计证明,在整个软件开发生命周期中,30% 至70% 的代码逻辑设计和编码缺陷是可以通过静态代码分析来发现和修复的。

但是,由于静态代码分析往往要求大量的时间消耗和相关知识的积累,因此对于软件开发团队来说,使用静态代码分析工具自动化执行代码检查和分析,能够极大地提高软件可靠性并节省软件开发和测试成本。

静态代码分析工具的优势1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷。

简单黑客代码

简单黑客代码

简单黑客代码简单黑客代码是指能够让普通人轻松掌握的基础黑客技术,其中包含了一些简单却非常实用的代码,可以用于网络安全检测、漏洞利用和密码破解等方面。

在黑客领域,又称为“入门代码”或“初级代码”。

下面将就简单黑客代码作一简单介绍。

一、网络安全检测代码1. 网络Ping扫描代码在命令行下输入代码:ping -t 192.168.1.1,能够实现对局域网中指定地址的Ping扫描,定位网络故障。

2. 端口扫描代码使用Nmap扫描指定IP地址可知道该IP地址开放了哪些端口,留下了哪些漏洞。

使用黑客已经熟练掌握,这里只简单介绍Nmap命令行使用方法:nmap IP地址:对指定IP地址的端口进行扫描nmap -O IP地址:通过探测目标操作系统对端口进行扫描3. SQL注入漏洞检测代码使用SQLmap对目标网站进行扫描,获得数据库的结构、数据和管理员密码等敏感信息,实现轻松访问网站。

SQLmap使用方法:python sqlmap.py -u URL --dbs:扫描目标网站,获取目标数据库信息python sqlmap.py -u URL -D 数据库名 --tables:获取指定数据库的所有数据表二、漏洞利用代码1. Metasploit利用漏洞代码Metasploit是一个开源的渗透测试框架,包含超过1600种已知漏洞的利用模块。

Metasploit使用流程:msf > search 关键字:搜索系统有没有指定关键字相关的漏洞msf > use exploit/path/soon:选择一个漏洞利用模块msf > set payload payload/windows/meterpreter/reverse_tcp:设置payload上传反弹回来的shellmsf > set RHOSTS IP地址:设置目标主机IP地址msf > exploit:开始攻击2. 远程溢出漏洞利用代码使用Metasploit实现对远程主机的控制,即可进行任意操作。

键盘码表 单键扫描码 ascii 组合键码

键盘码表 单键扫描码 ascii 组合键码

字母和空格按键的编码表按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码a 1E 61 1E 41 1E 01 1E 00b 30 62 30 42 30 02 30 00c 2E 63 2E 43 2E 03 2E 00d 20 64 20 44 20 04 20 00e 12 65 12 45 12 05 12 00f 21 66 21 46 21 06 21 00g 22 67 22 47 22 07 22 00h 23 68 23 48 23 08 23 00i 17 69 17 49 17 09 17 00 j 24 6A 24 4A 24 0A 24 00 k 25 6B 25 4B 25 0B 25 00 l 26 6C 26 4C 26 0C 26 00 m 32 6D 32 4D 32 0D 32 00 n 31 6E 31 4E 31 0E 31 00 o 18 6F 18 4F 18 0F 18 00 p 19 70 19 50 19 10 19 00 q 10 71 10 51 10 11 10 00 r 13 72 13 52 13 12 13 00 s 1F 73 1F 53 1F 13 1F 00 t 14 74 14 54 14 14 14 00 u 16 75 16 55 16 15 16 00 v 2F 76 2F 56 2F 16 2F 00 w 11 77 11 57 11 17 11 00 x 2D 78 2D 58 2D 18 2D 00 y 15 79 15 59 15 19 15 00 z 2C 7A 2C 5A 2C 1A 2C 00 SpaceBar 39 20 39 20 39 20 39 20功能键和数字键盘的编码表·内容正文按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码F1 3B 00 54 00 5E 00 68 00 F2 3C 00 55 00 5F 00 69 00 F3 3D 00 56 00 60 00 6A 00 F4 3E 00 57 00 61 00 6B 00 F5 3F 00 58 00 62 00 6C 00 F6 40 00 59 00 63 00 6D 00 F7 41 00 5A 00 64 00 6E 00 F8 42 00 5B 00 65 00 6F 00 F9 43 00 5C 00 66 00 70 00 F10 44 00 5D 00 67 00 71 00 F11 85 00 87 00 89 00 8B 00 F12 86 00 88 00 8A 00 8C 00 键盘码表:单键扫描码,ascii,组合键码数字键盘的编码表按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码Ins&0 52 00 52 30 92 00 00 End&1 4F 00 4F 31 75 00 00 01 ↓&2 50 00 50 32 91 00 00 02 PgDn&3 51 00 51 33 76 00 00 03 ←&4 4B 00 4B 34 73 00 00 04 5 4C 00 4C 35 8F 00 00 05 →&6 4D 00 4D 36 74 00 00 06 Home&7 47 00 47 37 77 00 00 07 ↑&8 48 00 48 38 8D 00 00 08 PgUp&9 49 00 49 39 84 00 00 09 + 4E 2B 4E 2B 90 00 4E 00 - 4A 2D 4A 2D 8E 00 4A 00 Del&'.' 53 00 53 2E 93 00 00 * 37 2A 37 2A 96 00 37 00第一排数字键盘的编码表按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码`@~ 29 60 29 7E 00 29 00 1@! 02 31 02 21 00 78 00 2@@ 03 32 03 40 03 00 79 00 3@# 04 33 04 23 00 7A 00 4@$ 05 34 05 24 00 7B 00 5@% 06 35 06 25 00 7C 00 6@^ 07 36 07 5E 07 1E 7D 00 7@& 08 37 08 26 00 7E 00 8@* 09 38 09 2A 00 7F 00 9@( 0A 39 0A 38 00 80 00 0@) 0B 30 0B 29 00 81 00 -@_0C 2D 0C 5F 0C 1F 82 00 =@+0D 3D 0D 2B 00 83 00操作、标号和附加按键等的编码表·内容正文按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码Esc 01 1B 01 1B 01 1B 01 00 Backspace 0E 08 0E 08 0E 7F 0E 00 Tab 0F 09 0F 00 94 00 A5 00 Enter 1C 0D 1C 0D 1C 0A 1C 00标号按键的编码表按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码[@{ 1A 5B 1A 7B 1A 1B 1A 00]@} 1B 5D 1B 7D 1B 1D 1B 00 ;@: 27 3B 27 3A 00 27 00 @" 28 27 28 22 00 28 00 \@| 2b 5C 2b 7C 2B 1C 2b 00 , @ < 33 2C 33 3C 00 33 00 . @> 34 2E 34 3E 00 34 00 / @ ? 35 2F 35 3F 00 35 00、附加按键的编码表按键单键SHIFT CTRL ALT扫描码ASCII码扫描码ASCII码扫描码ASCII码扫描码ASCII码Flash(/) E0 2F E0 2F 95 00 A4 00 Enter E0 0D E0 0D E0 0A A6 00 Home 47 E0 47 E0 77 E0 97 00 End 4F E0 4F E0 75 E0 9F 00 PageUp 49 E0 49 E0 84 E0 99 00 PageDown 51 E0 51 E0 76 E0 A1 00 DnArrow 50 E0 50 E0 91 E0 A0 00 LeftArrow 4B E0 4B E0 73 E0 9B 00 RightArrow 4D E0 4D E0 74 E0 9D 00 UpArrow 48 E0 48 E0 8D E0 98 00 Ins 52 E0 52 E0 92 E0 A2 00 Del 53 E0 53 E0 93 E0 A3 00其它按键的扫描码当这些键被按下时,BIOS并没有把它们的扫描码输入键盘缓冲区。

七款JAVA静态代码扫描工具详解

七款JAVA静态代码扫描工具详解

七款JAVA静态代码扫描⼯具详解优秀的团队为了保证可读性、可维护性、避免重复踩坑与保证代码质量,都会推出⼀些开发规范来遵守。

开发规范是前置主动要求团队成员遵守的,⽽光靠意识是难以保证完全遵守规范的,所以还需要⼀些⼯具辅助。

当然即使有⼯具做这些事情,规范也是必须推⼴的,让⼤家先仔细读读,毕竟直接写出优秀的代码是最好的,然后再辅助⼯具乃最佳实践。

开发规范⼀流公司制定规范,⼆流公司申请专利,三流公司⽣产产品。

所以⽬前公开规范的⼤多是⼤⼚的规范。

⽬前知道⼤⼚公开的Java开发规范Google开发规范 github markdown格式阿⾥巴巴开发规范 PDF格式点我华为开发规范Oracle开发规范阿⾥巴巴的开发规范,虽然不是单纯的规范,还包括了开发中的各种坑从主观上的⼀些强制规定,但是总体上还是很有⽤的,可以拿来部分or全部直接执⾏。

独⽴的组件1. FindBugs只寻找可能存在bug的地⽅,不注重样式或者格式,它试图只寻找真正的缺陷或者潜在的性能问题。

特点基于class分析,如果你clean了再去执⾏发现没有执⾏⽣成报告,所以需要编译后才能执⾏分析有maven插件,有IDE插件(eclipse插件,也有idea插件)开发时不⽤使⽤maven插件,要编译执⾏检测⽣成xml然后再⽣成⽹页查看结果,挺⿇烦。

如果要与Jenkins集成的时候,maven 插件就有⽤了,开发时使⽤IDE插件⾮常⽅便插件中Bug Explorer 中的灰⾊图标处为 Bug 类型,红⾊图标表⽰ bug 较为严重,黄⾊的图标表⽰ bug 为警告程度代码缺陷分类根据缺陷的性质,⼤致可以分为下列⼏类Bad practice 不好的做法Correctness 可能有不正确Dodgy code 糟糕的代码Experimental 实验Internationalization 国际化Malicious code vulnerility 恶意的代码漏洞Multithreaded correctness 多线程问题Performance 性能问题FindBugs官⽅⽹站上也给出了⼀些案例:排除单个规则如果是排除⼀类规则,点击IDE旁边的提⽰选择排除类型就⾏可以针对规则排除单独类中的接触限制,使⽤注解@edu.umd.cs.findbugs.annotations.SuppressFBWarnings要加⼊依赖 provided代表只在编译时依赖,打包后就没有这个依赖了IDE旁边提⽰也有这种,不过不会加⼊以下依赖,需要⼿动在POM中加<dependency><groupId>com.google.code.findbugs</groupId><artifactId>annotations</artifactId><version>3.0.1</version><scope>provided</scope></dependency><dependency><groupId>com.google.code.findbugs</groupId><artifactId>jsr305</artifactId><version>3.0.1</version><scope>provided</scope></dependency>2. CheckStyle代码样式风格检查,专门check代码规范风格的,⽐如缩进,换⾏操作,命名⼤项⽬往往是有很多⼈⼀起完成的,然⽽每个⼈都有⾃⼰的style,导致整个项⽬的代码不仅存在不符合语⾔规范的情况,⽽且读起来⾮常困难。

直线扫描转换代码-MATLAB[技巧]

直线扫描转换代码-MATLAB[技巧]

一、直线扫描转换%file1.m文件,这是主文件%x=0,y=0,r=1;%Bresenhamcircle(x,y,r);clear all;clc;p1=[19 820];p2=[-1609 2370];%Line_Scanner_DDA(p1(1),p1(2),p2(1),p2(2));%Line_Scanner_Bresenham(p1,p2);line_Bresenham(p1,p2);line_DDA(p1,p2);%x=[3.12 -3.6];%ceil(x)%line_Bresenham.m文件,实现直线扫描转换的bresenham算法function line_Bresenham(p1,p2)XX=p2(1)-p1(1);YY=p2(2)-p1(2);XYSwitch=0;%表示x和y是否交换,1表示需要交换YSign=1;%表示YY的符号,-1表示经过了y->-y的转换if XX*YY==0if YY==0t=sort([p1(1),p2(1)]);Point(:,1)=(t(1):t(2))';Point(:,2)=zeros(t(2)-t(1)+1,1)+p1(2);elset=sort([p1(2),p2(2)]);Point(:,2)=(t(1):t(2))';Point(:,1)=zeros(t(2)-t(1)+1,1)+p1(1);endelse%如果斜率的绝对值大于1,则交换x和yif abs(YY)>abs(XX)XYSwitch=1;t(1)=p1(1);p1(1)=p1(2);p1(2)=t(1);t(1)=p2(1);p2(1)=p2(2);p2(2)=t(1);end%如果x1>x2则交换p1和p2if p1(1)>p2(1)t=[p1(1),p1(2)];p1=[p2(1),p2(2)];p2=t;endXX=p2(1)-p1(1);YY=p2(2)-p1(2);%如果y1>y2,则做y->-y的转换if YY<0p1(2)=-p1(2);p2(2)=-p2(2);YSign=-1;endYY=p2(2)-p1(2);%开始计算点d=XX-2*YY;P=[p1(1),p1(2)];k=1;while P(1)<=p2(1)Point(k,:)=P;if d<0P=P+ones(1,2);d=d+2*XX-2*YY;elseP(1)=P(1)+1;d=d-2*YY;endk=k+1;end%恢复点if YSign==-1Point(:,2)=-Point(:,2);endif XYSwitch==1t=Point(:,1);Point(:,1)=Point(:,2);Point(:,2)=t;endend%绘制点figure();scatter(Point(:,1),Point(:,2),2,'.'); legend('Bresenham算法');% line_DDA.m文件,实现直线扫描转换的数值微分算法function line_DDA(P1,P2)p1=[P1(1),P1(2)];p2=[P2(1),P2(2)];XY=p2-p1;%x轴和y轴增量XYSwitch=0;%标记P1和P2的x和y是否交换过,1表示需要交换YSign=1;%标记y轴增量符号,-1表示需要进行y->-y的转换if XY(1)*XY(2)==0if XY(1)==0t=sort([p1(2),p2(2)]);Point(:,2)=(t(1):t(2))';Point(:,1)=zeros(t(2)-t(1)+1,1)+p1(1);elset=sort([p1(1),p2(1)]);Point(:,1)=(t(1):t(2))';Point(:,2)=zeros(t(2)-t(1)+1,1)+p1(2);endelse%如果斜率的绝对值大于1,则交换x和yif abs(XY(2))>abs(XY(1))XYSwitch=1;t(1)=p1(1);p1(1)=p1(2);p1(2)=t(1);t(1)=p2(1);p2(1)=p2(2);p2(2)=t(1);end%如果x1>x2,则交换p1和p2if p1(1)>p2(1)t=p1;p1=p2;p2=t;endXY=p2-p1;%如果y1>y2,则做y->-y的转换if XY(2)<0p1(2)=-p1(2);p2(2)=-p2(2);YSign=-1;endXY=p2-p1;%开始计算k=XY(2)/XY(1);Point(:,1)=(p1(1):p2(1))';Point(:,2)=round((0:abs(XY(1)))'*k+p1(2));%恢复变换if YSign==-1Point(:,2)=-Point(:,2);endif XYSwitch==1t=Point(:,1);Point(:,1)=Point(:,2);Point(:,2)=t;endend%将计算得到的点画出来figure();scatter(Point(:,1),Point(:,2),2,'.');legend('DDA算法');。

Jenkins构建之代码扫描

Jenkins构建之代码扫描

Jenkins构建之代码扫描Sonar简介Sonar 是⼀个⽤于代码质量管理的开放平台。

通过插件机制,Sonar可以集成不同的测试⼯具,代码分析⼯具,以及持续集成⼯具。

与持续集成⼯具(例如 Hudson/Jenkins 等)不同,Sonar 并不是简单地把不同的代码检查⼯具结果(例如 FindBugs,PMD 等)直接显⽰在 Web 页⾯上,⽽是通过不同的插件对这些结果进⾏再加⼯处理,通过量化的⽅式度量代码质量的变化,从⽽可以⽅便地对不同规模和种类的⼯程进⾏代码质量管理。

在对其他⼯具的⽀持⽅⾯,Sonar 不仅提供了对 IDE 的⽀持,可以在 Eclipse和 IntelliJ IDEA 这些⼯具⾥联机查看结果;同时 Sonar 还对⼤量的持续集成⼯具提供了接⼝⽀持,可以很⽅便地在持续集成中使⽤ Sonar。

此外,Sonar 的插件还可以对 Java 以外的其他编程语⾔提供⽀持,对国际化以及报告⽂档化也有良好的⽀持代码质量测试代码质量七宗罪# 编码规范:是否遵守了编码规范,遵循了最佳实践。

# 潜在的 BUG:可能在最坏情况下出现问题的代码,以及存在安全漏洞的代码。

# ⽂档和注释:过少(缺少必要信息)、过多(没有信息量)、过时的⽂档或注释。

# 重复代码:违反了 Don’t Repeat Yourself 原则。

# 复杂度:代码结构太复杂(如圈复杂度⾼),难以理解、测试和维护。

# 测试覆盖率:编写单元测试,特别是针对复杂代码的测试覆盖是否⾜够。

# 设计与架构:是否⾼内聚、低耦合,依赖最少。

Sonar部署Sonar的功能就是来检查代码是否有BUG。

除了检查代码是否有bug还有其他的功能,⽐如说:你的代码注释率是多少,代码有⼀些建议,编写语法的建议。

所以我们叫质量管理.准备java环境和sonaqube包# jdk下载地址# /technetwork/java/javase/downloads/java-archive-javase8-2177648.html# 卸载系统⾃带的java环境[root@jenkins-8 git-2.9.5]# rpm -qa |grep jdk[root@jenkins-8 git-2.9.5]# javabash: java: 未找到命令# 解压安装jdktar xvf jdk-8u151-linux-x64.tar.gz -C /usr/local/cd /usr/local/mv jdk1.8.0_151/ jdk# 修改/etc/bashrc配置⽂件,末尾加⼊下⾯⼀⾏环境变量.tail -2 /etc/bashrcJAVA_HOME=/usr/local/jdkexport PATH=$PATH:$JAVA_HOME/binsource /etc/bashrcjava -version # 尽量不要⽤openjdkjava version "1.8.0_151"Java(TM) SE Runtime Environment (build 1.8.0_151-b12)Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)# sonar下载地址# /downloads/# 最新版的Sonar需要⾄少JDK1.8以上版本, 建议⽤国外⽹络下载,此处我使⽤5.6https:///Distribution/sonarqube/unzip sonarqube-6.5.zipmv sonarqube-6.5 /usr/local/ln -s /usr/local/sonarqube-6.5/ /usr/local/sonarqube配置数据库wget /get/mysql57-community-release-el7-8.noarch.rpmrpm -ivh mysql57-community-release-el7-10.noarch.rpmyum install -y mysql-community-serversystemctl start mysqld.service# 修改Mysql密码下⾯有三种办法# 1.刚安装好的mysql,可以从/var/log/mysqld.log获取临时密码grep "password" /var/log/mysqld.log[root@mysql ~]# mysql -uroot -pEnter password:mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'ZHOUjian.22';# 2.mysqladmin -uroot -p password "ZHOUjian.22"Enter password:# 3.实验环境不知道root密码操作⽅法如下sed -i '/\[mysqld]/ a skip-grant-tables' /etc/fsystemctl restart mysqldmysql <<EOFupdate er set authentication_string='' where user='root' and Host='localhost';flush privileges;EOFsed -i '/skip-grant/d' /etc/fsystemctl restart mysqldmysqladmin -uroot -p password "ZHOUjian.20"Enter password: # 此处回车⼀下即可CREATE DATABASE sonar CHARACTER SET utf8 COLLATE utf8_general_ci;GRANT ALL ON sonar.* TO sonar@"%" IDENTIFIED BY "ZHOUjian.20";flush privileges;配置启动Sonarcd /usr/local/sonarqube/conf/vim sonar.propertiesername=sonarsonar.jdbc.password=123456sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false sonar.web.host=0.0.0.0sonar.web.port=9000# 启动sonar/usr/local/sonarqube/bin/linux-x86-64/sonar.sh startStarting SonarQube...SonarQube is already running.# 验证端⼝ss -atnp |grep 9000LISTEN 0 25 *:9000 *:* users:(("java",pid=18028,fd=77))访问web界⾯默认admin/admin安装中⽂⽀持/usr/local/sonarqube/extensions/plugins/ #插件本地路径安装中⽂插件:mv sonar-l10n-zh-plugin-1.11.jar /usr/local/sonarqube/extensions/plugins/administration-system-update center-available,在后⾯的搜索框搜索插件名称,然后点 install 安装:或在插件⽬录 /usr/local/sonar/extensions/plugins 执⾏以下命令:wget https:///SonarQubeCommunity/sonar-l10n-zh/releases/download/sonar-l10n-zh p lugin-1.11/sonar-l10n-zh-plugin-1.11.jar# 重启服务⽣效/usr/local/sonarqube/bin/linux-x86-64/sonar.sh restart# 刷新页⾯即可看到中⽂了安装插件可以安装各种语⾔插件php,java,pythonSonar-scaner扫描器部署使⽤Sonar-scaner扫描sonarqube 通过调⽤扫描器 sonar-scanner 进⾏代码质量分析,即扫描器的具体⼯作就是扫描代码:unzip sonar-scanner-2.6.1.zipmv sonar-scanner-2.6.1 /usr/local/ln -s /usr/local/sonar-scanner-2.6.1/ /usr/local/sonar-scannercd /usr/local/sonar-scanner/grep "^[a-Z]" conf/sonar-scanner.propertiessonar.host.url=http://149.129.38.117:9000sonar.sourceEncoding=UTF-8ername=sonarsonar.jdbc.password=ZHOUjian.21sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&amp;characterEncoding=utf8准备测试代码unzip sonar-examples-master.zipmv sonar-examples-master/ /usr/local/src/cd /usr/local/src/sonar-examples-master/cat projects/languages/python/python-sonar-runner/sonar-project.properties# Required metadatasonar.projectKey=org.sonarqube:python-simple-sonar-scannersonar.projectName=Python :: Simple Project : SonarQube Scanner # 项⽬名称,会显⽰在仪表盘sonar.projectVersion=1.0# Comma-separated paths to directories with sources (required)sonar.sources=src # 代码⽬录# Languagenguage=py # 语⾔格式# Encoding of the source filessonar.sourceEncoding=UTF-8执⾏扫描# 注意看我当前⽬录[root@jenkins python-sonar-runner]# pwd/usr/local/src/sonar-examples-master/projects/languages/python/python-sonar-runner# ⼿动在当前项⽬⽬录执⾏扫描,⼀下是扫描过程中信息# sonar-project.propertie 每个项⽬都要有/usr/local/sonar-scanner/bin/sonar-scannerINFO: Scanner configuration file: /usr/local/sonar-scanner/conf/sonar-scanner.propertiesINFO: Project root configuration file: /usr/local/src/sonar-examples-master/projects/languages/python/python-sonar-runner/sonar-project.properties INFO: SonarQube Scanner 2.6.1INFO: Java 1.8.0_151 Oracle Corporation (64-bit)INFO: Linux 3.10.0-514.26.2.el7.x86_64 amd64INFO: User cache: /root/.sonar/cacheINFO: Load global settingsINFO: Load global settings (done) | time=252msWARN: Property 'sonar.jdbc.url' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.WARN: Property 'ername' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.WARN: Property 'sonar.jdbc.password' is not supported any more. It will be ignored. There is no longer any DB connection to the SQ database.INFO: User cache: /root/.sonar/cacheINFO: Load plugins indexINFO: Load plugins index (done) | time=30msINFO: Download sonar-csharp-plugin-5.10.1.1411.jarINFO: Download sonar-python-plugin-1.8.0.1496.jarINFO: Download sonar-java-plugin-4.12.0.11033.jarINFO: Download sonar-l10n-zh-plugin-1.11.jarINFO: Plugin [l10nzh] defines 'l10nen' as base plugin. This metadata can be removed from manifest of l10n plugins since version 5.2.INFO: Download sonar-flex-plugin-2.3.jarINFO: Download sonar-scm-git-plugin-1.2.jarINFO: Download sonar-xml-plugin-1.4.3.1027.jarINFO: Download sonar-php-plugin-2.10.0.2087.jarINFO: Download sonar-scm-svn-plugin-1.5.0.715.jarINFO: Download sonar-javascript-plugin-3.1.1.5128.jarINFO: SonarQube server 6.5.0INFO: Default locale: "en_US", source code encoding: "UTF-8"INFO: Process project propertiesINFO: Load project repositoriesINFO: Load project repositories (done) | time=199msINFO: Load quality profilesINFO: Load quality profiles (done) | time=106msINFO: Load active rulesINFO: Load active rules (done) | time=1965msINFO: Load metrics repositoryINFO: Load metrics repository (done) | time=202msWARN: SCM provider autodetection failed. No SCM provider claims to support this project. Please use sonar.scm.provider to define SCM of your project.INFO: Publish modeINFO: Project key: org.sonarqube:python-simple-sonar-scannerINFO: ------------- Scan Python :: Simple Project : SonarQube ScannerINFO: Load server rulesINFO: Load server rules (done) | time=277msINFO: Language is forced to pyINFO: Base dir: /usr/local/src/sonar-examples-master/projects/languages/python/python-sonar-runnerINFO: Working dir: /usr/local/src/sonar-examples-master/projects/languages/python/python-sonar-runner/.sonarINFO: Source paths: srcINFO: Source encoding: UTF-8, default locale: en_USINFO: Index filesINFO: 9 files indexedINFO: Quality profile for py: Sonar wayINFO: Sensor PythonXUnitSensor [python]INFO: Sensor PythonXUnitSensor [python] (done) | time=115msINFO: Sensor Python Squid Sensor [python]INFO: Python unit test coverageINFO: Python integration test coverageINFO: Python overall test coverageINFO: Sensor Python Squid Sensor [python] (done) | time=1378msINFO: Sensor SonarJavaXmlFileSensor [java]INFO: Sensor SonarJavaXmlFileSensor [java] (done) | time=0msINFO: Sensor Analyzer for "php.ini" files [php]INFO: Sensor Analyzer for "php.ini" files [php] (done) | time=13msINFO: Sensor Zero Coverage SensorINFO: Sensor Zero Coverage Sensor (done) | time=27msINFO: Sensor CPD Block IndexerINFO: Sensor CPD Block Indexer (done) | time=157msINFO: No SCM system was detected. You can use the 'sonar.scm.provider' property to explicitly specify it.INFO: 5 files had no CPD blocksINFO: Calculating CPD for 4 filesINFO: CPD calculation finishedINFO: Analysis report generated in 141ms, dir size=54 KBINFO: Analysis reports compressed in 26ms, zip size=27 KBINFO: Analysis report uploaded in 782msINFO: ANALYSIS SUCCESSFUL, you can browse http://149.129.38.117:9000/dashboard/index/org.sonarqube:python-simple-sonar-scanner INFO: Note that you will be able to access the updated dashboard once the server has processed the submitted analysis reportINFO: More about the report processing at http://149.129.38.117:9000/api/ce/task?id=AXK4TU1CIpzWVToFffwUINFO: Task total time: 20.514 sINFO: ------------------------------------------------------------------------INFO: EXECUTION SUCCESSINFO: ------------------------------------------------------------------------INFO: Total time: 38.804sINFO: Final Memory: 43M/105MINFO: ------------------------------------------------------------------------# 接下来我们到sonar仪表看查看⼀下Jenkins关联到SonarQubejenkins安装sonar插件Jenkins安装请看上⼀篇⽂章要想让Jenkins关联到sonarqube需要先安装插件,在jenkins插件安装SonarQubePlugin,其次配置SonarQube server.jenkins配置sonarjenkins关联到sonar配置扫描[root@jenkins ~]# cat /usr/local/src/sonar-examples-master/projects/languages/python/python-sonar-runner/sonar-project.properties # Required metadatasonar.projectKey=org.sonarqube:python-simple-sonar-scannersonar.projectName=Python :: Simple Project : SonarQube Scannersonar.projectVersion=1.0# Comma-separated paths to directories with sources (required)sonar.sources=src# Languagenguage=py# Encoding of the source filessonar.sourceEncoding=UTF-8。

java代码扫描:pmd开源项目介绍

java代码扫描:pmd开源项目介绍

java代码扫描:pmd开源项目介绍java代码扫描:pmd开源项目介绍。

能够扫描java代码,并发现潜在的问题与bug。

PMD scans Java source code and looks for potential problems like:•Possible bugs - empty try/catch/finally/switch statements •Dead code - unused local variables, parameters and private methods•Suboptimal code - wasteful String/StringBuffer usage•Overcomplicated expressions - unnecessary if statements, for loops that could be while loops•Duplicate code - copied/pasted code means copied/pasted bugs翻译:PMD扫描java代码并寻找潜在的如下问题:1.可能的bug - 空try/catch/finally/switch语句2.无效代码 -未使用的变量,参数和私有方法3.非最佳的代码 - 较耗费资源的String/StringBuffer用法4.过于复杂的表达式 - 不必要的if语句,或应该为while的for循环5.重复代码 - 复制/粘贴代码意味着复制/粘贴bug以前在项目组,把它和CruiseControl集成起来用过,针对项目持续集成构建,它能自动检测各成员提交代码规范性和潜在问题,并自动发送不合格问题到提交代码人邮箱。

但由于发现的问题太多,最后还是取消了。

今天再次想起它来了,把它的用法详细的说下1.下载PMD压缩包最新pmd4.2.5.zip2.解压3.创建如下脚本文件(checkAll.bat),放置在解压后的bin目录下:@echo offrem author:xiadehu 2009-8-22rem 要检查的文件和路径setfilepath=F:\SRC\EASCBM\CBMS_SRC\CBMS_CJ001_Common\ProductCode\com\z te\cbms\common\framework\upload\MyUpload.javarem 报告输出的路径set reportpath=E:\code-check-report\rem 获取当前年月日和时分秒set nowTime=%DATE:~0,10%" "%TIME:~1,7%rem 替换:为-set nowTime=%nowtime::=-%rem 合成报告文件路径名set outfile=%reportpath%%nowtime%.htmlrem 指定输出rendenerset xslt="../etc/xslt/corley-pmd-report.xslt"rem 指定检查规则,这里包括了官方推出的java的所有规则4.以上脚本要设置的只有要检查的文件路径(java文件,文件夹,jar/zip包),和检查结果要输出的目录即可。

二维码扫描代码

二维码扫描代码
//然后,可以使用如下代码来把一个字符串放置到 剪贴板上:
pasteboard.string = [arrInfoFoot objectAtIndex:1];
}
}
//二维码的扫描区域 - (void)setScanView {
_scanView=[[UIView alloc]initWithFrame:CGRectMake(0,0,VIEW_WIDTH,VIEW_HE IGHT-64)];
[self.view addSubview:_readerView];
//扫描区域 //readerView.scanCrop =
[_readerView start];
[self createTimer];
} #pragma mark -- ZBarReaderViewDelegate -(void)readerView:(ZBarReaderView *)readerView didReadSymbols:(ZBarSymbolSet *)symbols fromImage:(UIImage *)image {
//scanCropView.image=[UIImage imageNamed:@""];
yer.borderColor=[UIColor getThemeColor].CGColor;
yer.borderWidth=2.0;
scanCropView.backgroundColor=[UIColor clearColor]; [_scanView addSubview:scanCropView];
//设置扫描画面 UIView *_scanView; ZBarReaderView *_readerView; }
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

bool blnNamingOnly = false;
string strFullPathFileName = "";
bool bl = axImgScan1.ScannerAvailable();
gstrWindowsTempDirectory = "D:\\";
if (axImgScan1.ScannerAvailable() == true)//判断扫描仪是否可用
{
sPath = createFolder(); //创建文件夹
//检查文件夹是否存在文件,如文件存在,检测最后一个文件名,提取文件数字
DirectoryInfo dir = new DirectoryInfo(sPath);
FileInfo[] finfo = dir.GetFiles();
string fnames = "";
for (int i = 0; i < finfo.Length; i++)
{
fnames = finfo[i].Name.Substring(20, 3);//截取文件名中的最后3为字符
if (int.Parse(fnames) > intNum)
intNum = int.Parse(fnames);
}
intNum = intNum + 1;
tooloptimizeBtn.Text = intNum.ToString();
axImgScan1.PageOption =
ScanLibCtl.PageOptionConstants.AppendPages;//axImgScan1.PageOption =
ScanLibCtl.PageOptionConstants.PromptToCreateNewFile;
axImgScan1.OpenScanner();//打开扫描仪
axImgScan1.ScanTo = ScanLibCtl.ScanToConstants.DisplayAndFile;//以何种形式扫描,如仅文件、仅显示、或显示加文件
axImgScan1.MultiPage = true;//扫描多页
axImgScan1.FileType = ScanLibCtl.FileTypeConstants.TIFF;//被扫描后的文件存储格式类型
axImgScan1.Page = axImgScan1.PageCount + 1;//新添加
axImgScan1.Scroll = true;
axImgScan1.SetPageTypeCompressionOpts(pPreferenceConstants.GoodDisplay, ScanLibCtl.ImageTypeConstants.ColorPal4Bit, pTypeConstants.TIFFPackbits, pInfoConstants.TIFFPackbitsInfo);//.G31DFaxRBO)
axImgScan1.Image = @sPath + "\\"+ label171.Text + "-"+ intNum.ToString("000") + ".tif";//保存文件 + "*"
axImgScan1.StartScan();
//axImgScan1.DestImageControl = "axImgEdit1";
//axImgThumbnail1.Image = axImgScan1.Image;
//axImgThumbnail1.DisplayThumbs();
//sum = axImgThumbnail1.ThumbCount;
axImgScan1.StopScan();
axImgScan1.CloseScanner();
}
else
{
MessageBox.Show("扫描仪没有正确连接,请重新设置!", "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
}
strFullPathFileName = axImgScan1.Image;
PerformFileOpen(blnNamingOnly, strFullPathFileName, 1);
return;
//在扫描结束后,弹出提示对话框
sum = axImgThumbnail1.ThumbCount;
frmMain.isSavePic = 1;
frmMain.strFileDesc = label230.Text;
frmFileDescribe frmFileDescribe = new frmFileDescribe();
frmFileDescribe.ShowDialog();
//saveAllPicture();//存储全部扫描的图片
函数: PerformFileOpen
public void PerformFileOpen(bool blnNamingOnly, string strFullPathFileName,int lngPageNo)
{
axImgAdmin1.Image = strFullPathFileName;
axImgEdit1.Image = strFullPathFileName;
axImgThumbnail1.Image = strFullPathFileName;
gintFileType = axImgAdmin1.FileType.ToString();
axImgAdmin1.PageNumber = lngPageNo;
axImgEdit1.Page = lngPageNo;
axImgThumbnail1.set_ThumbSelected(lngPageNo,true);
}。

相关文档
最新文档