http协议之digest认证实现

2023-05-16

参考

http://blog.csdn.net/jszj/article/details/8918967

https://wenku.baidu.com/view/22be2dcf83d049649b6658ff.html

http://blog.csdn.net/i_lovefish/article/details/9816783


md5.h

#ifndef MD5_H

#define MD5_H


typedef struct

{

unsigned int count[2];

unsigned int state[4];

unsigned char buffer[64];

}MD5_CTX;



#define F(x,y,z) ((x & y) | (~x & z))

#define G(x,y,z) ((x & z) | (y & ~z))

#define H(x,y,z) (x^y^z)

#define I(x,y,z) (y ^ (x | ~z))

#define ROTATE_LEFT(x,n) ((x << n) | (x >> (32-n)))

#define FF(a,b,c,d,x,s,ac) \

          { \

          a += F(b,c,d) + x + ac; \

          a = ROTATE_LEFT(a,s); \

          a += b; \

          }

#define GG(a,b,c,d,x,s,ac) \

          { \

          a += G(b,c,d) + x + ac; \

          a = ROTATE_LEFT(a,s); \

          a += b; \

          }

#define HH(a,b,c,d,x,s,ac) \

          { \

          a += H(b,c,d) + x + ac; \

          a = ROTATE_LEFT(a,s); \

          a += b; \

          }

#define II(a,b,c,d,x,s,ac) \

          { \

          a += I(b,c,d) + x + ac; \

          a = ROTATE_LEFT(a,s); \

          a += b; \

          }                                            

void MD5Init(MD5_CTX *context);

void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen);

void MD5Final(MD5_CTX *context, unsigned char digest[16]);

void MD5Transform(unsigned int state[4], unsigned char block[64]);

void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len);

void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len);


#endif


md5.cpp

#include <memory.h>

#include "md5.h"


unsigned char PADDING[] = { 0x80,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,

0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 };


void MD5Init(MD5_CTX *context)

{

context->count[0] = 0;

context->count[1] = 0;

context->state[0] = 0x67452301;

context->state[1] = 0xEFCDAB89;

context->state[2] = 0x98BADCFE;

context->state[3] = 0x10325476;

}

void MD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputlen)

{

unsigned int i = 0, index = 0, partlen = 0;

index = (context->count[0] >> 3) & 0x3F;

partlen = 64 - index;

context->count[0] += inputlen << 3;

if (context->count[0] < (inputlen << 3))

context->count[1]++;

context->count[1] += inputlen >> 29;


if (inputlen >= partlen)

{

memcpy(&context->buffer[index], input, partlen);

MD5Transform(context->state, context->buffer);

for (i = partlen; i + 64 <= inputlen; i += 64)

MD5Transform(context->state, &input[i]);

index = 0;

}

else

{

i = 0;

}

memcpy(&context->buffer[index], &input[i], inputlen - i);

}

void MD5Final(MD5_CTX *context, unsigned char digest[16])

{

unsigned int index = 0, padlen = 0;

unsigned char bits[8];

index = (context->count[0] >> 3) & 0x3F;

padlen = (index < 56) ? (56 - index) : (120 - index);

MD5Encode(bits, context->count, 8);

MD5Update(context, PADDING, padlen);

MD5Update(context, bits, 8);

MD5Encode(digest, context->state, 16);

}

void MD5Encode(unsigned char *output, unsigned int *input, unsigned int len)

{

unsigned int i = 0, j = 0;

while (j < len)

{

output[j] = input[i] & 0xFF;

output[j + 1] = (input[i] >> 8) & 0xFF;

output[j + 2] = (input[i] >> 16) & 0xFF;

output[j + 3] = (input[i] >> 24) & 0xFF;

i++;

j += 4;

}

}

void MD5Decode(unsigned int *output, unsigned char *input, unsigned int len)

{

unsigned int i = 0, j = 0;

while (j < len)

{

output[i] = (input[j]) |

(input[j + 1] << 8) |

(input[j + 2] << 16) |

(input[j + 3] << 24);

i++;

j += 4;

}

}

void MD5Transform(unsigned int state[4], unsigned char block[64])

{

unsigned int a = state[0];

unsigned int b = state[1];

unsigned int c = state[2];

unsigned int d = state[3];

unsigned int x[64];

MD5Decode(x, block, 64);

FF(a, b, c, d, x[0], 7, 0xd76aa478); /* 1 */

FF(d, a, b, c, x[1], 12, 0xe8c7b756); /* 2 */

FF(c, d, a, b, x[2], 17, 0x242070db); /* 3 */

FF(b, c, d, a, x[3], 22, 0xc1bdceee); /* 4 */

FF(a, b, c, d, x[4], 7, 0xf57c0faf); /* 5 */

FF(d, a, b, c, x[5], 12, 0x4787c62a); /* 6 */

FF(c, d, a, b, x[6], 17, 0xa8304613); /* 7 */

FF(b, c, d, a, x[7], 22, 0xfd469501); /* 8 */

FF(a, b, c, d, x[8], 7, 0x698098d8); /* 9 */

FF(d, a, b, c, x[9], 12, 0x8b44f7af); /* 10 */

FF(c, d, a, b, x[10], 17, 0xffff5bb1); /* 11 */

FF(b, c, d, a, x[11], 22, 0x895cd7be); /* 12 */

FF(a, b, c, d, x[12], 7, 0x6b901122); /* 13 */

FF(d, a, b, c, x[13], 12, 0xfd987193); /* 14 */

FF(c, d, a, b, x[14], 17, 0xa679438e); /* 15 */

FF(b, c, d, a, x[15], 22, 0x49b40821); /* 16 */


  /* Round 2 */

GG(a, b, c, d, x[1], 5, 0xf61e2562); /* 17 */

GG(d, a, b, c, x[6], 9, 0xc040b340); /* 18 */

GG(c, d, a, b, x[11], 14, 0x265e5a51); /* 19 */

GG(b, c, d, a, x[0], 20, 0xe9b6c7aa); /* 20 */

GG(a, b, c, d, x[5], 5, 0xd62f105d); /* 21 */

GG(d, a, b, c, x[10], 9, 0x2441453); /* 22 */

GG(c, d, a, b, x[15], 14, 0xd8a1e681); /* 23 */

GG(b, c, d, a, x[4], 20, 0xe7d3fbc8); /* 24 */

GG(a, b, c, d, x[9], 5, 0x21e1cde6); /* 25 */

GG(d, a, b, c, x[14], 9, 0xc33707d6); /* 26 */

GG(c, d, a, b, x[3], 14, 0xf4d50d87); /* 27 */

GG(b, c, d, a, x[8], 20, 0x455a14ed); /* 28 */

GG(a, b, c, d, x[13], 5, 0xa9e3e905); /* 29 */

GG(d, a, b, c, x[2], 9, 0xfcefa3f8); /* 30 */

GG(c, d, a, b, x[7], 14, 0x676f02d9); /* 31 */

GG(b, c, d, a, x[12], 20, 0x8d2a4c8a); /* 32 */


  /* Round 3 */

HH(a, b, c, d, x[5], 4, 0xfffa3942); /* 33 */

HH(d, a, b, c, x[8], 11, 0x8771f681); /* 34 */

HH(c, d, a, b, x[11], 16, 0x6d9d6122); /* 35 */

HH(b, c, d, a, x[14], 23, 0xfde5380c); /* 36 */

HH(a, b, c, d, x[1], 4, 0xa4beea44); /* 37 */

HH(d, a, b, c, x[4], 11, 0x4bdecfa9); /* 38 */

HH(c, d, a, b, x[7], 16, 0xf6bb4b60); /* 39 */

HH(b, c, d, a, x[10], 23, 0xbebfbc70); /* 40 */

HH(a, b, c, d, x[13], 4, 0x289b7ec6); /* 41 */

HH(d, a, b, c, x[0], 11, 0xeaa127fa); /* 42 */

HH(c, d, a, b, x[3], 16, 0xd4ef3085); /* 43 */

HH(b, c, d, a, x[6], 23, 0x4881d05); /* 44 */

HH(a, b, c, d, x[9], 4, 0xd9d4d039); /* 45 */

HH(d, a, b, c, x[12], 11, 0xe6db99e5); /* 46 */

HH(c, d, a, b, x[15], 16, 0x1fa27cf8); /* 47 */

HH(b, c, d, a, x[2], 23, 0xc4ac5665); /* 48 */


 /* Round 4 */

II(a, b, c, d, x[0], 6, 0xf4292244); /* 49 */

II(d, a, b, c, x[7], 10, 0x432aff97); /* 50 */

II(c, d, a, b, x[14], 15, 0xab9423a7); /* 51 */

II(b, c, d, a, x[5], 21, 0xfc93a039); /* 52 */

II(a, b, c, d, x[12], 6, 0x655b59c3); /* 53 */

II(d, a, b, c, x[3], 10, 0x8f0ccc92); /* 54 */

II(c, d, a, b, x[10], 15, 0xffeff47d); /* 55 */

II(b, c, d, a, x[1], 21, 0x85845dd1); /* 56 */

II(a, b, c, d, x[8], 6, 0x6fa87e4f); /* 57 */

II(d, a, b, c, x[15], 10, 0xfe2ce6e0); /* 58 */

II(c, d, a, b, x[6], 15, 0xa3014314); /* 59 */

II(b, c, d, a, x[13], 21, 0x4e0811a1); /* 60 */

II(a, b, c, d, x[4], 6, 0xf7537e82); /* 61 */

II(d, a, b, c, x[11], 10, 0xbd3af235); /* 62 */

II(c, d, a, b, x[2], 15, 0x2ad7d2bb); /* 63 */

II(b, c, d, a, x[9], 21, 0xeb86d391); /* 64 */

state[0] += a;

state[1] += b;

state[2] += c;

state[3] += d;

}


digcalc.h

#pragma once


#define HASHLEN 16  

typedef char HASH[HASHLEN]; 

#define HASHHEXLEN 32  

typedef char HASHHEX[HASHHEXLEN+1]; 

#define IN 

#define OUT  /* calculate H(A1) as per HTTP Digest spec */

void DigestCalcHA1( IN char * pszAlg, IN char * pszUserName, IN char * pszRealm, IN char * pszPassword, IN char * pszNonce, IN char * pszCNonce, OUT HASHHEX SessionKey);  

/* calculate request-digest/response-digest as per HTTP Digest spec */ 

void DigestCalcResponse(IN HASHHEX HA1, /* H(A1) */  IN char * pszNonce, /* nonce from server */ IN char * pszNonceCount, /* 8 hex digits */ IN char * pszCNonce, /* client nonce */  IN char * pszQop, /* qop-value: "", "auth", "auth-int" */ IN char * pszMethod, /* method from the request */ IN char * pszDigestUri, /* requested URL */  IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */ OUT HASHHEX Response /* request-digest or response-digest */);


digcalc.cpp代码


#include "md5.h"

#include <string.h>

#include "digcalc.h" 


void CvtHex(IN HASH Bin, OUT HASHHEX Hex)

{

unsigned short i;

unsigned char j;

for (i = 0; i < HASHLEN; i++)

{

j = (Bin[i] >> 4) & 0xf;

if (j <= 9)  Hex[i * 2] = (j + '0');

else  Hex[i * 2] = (j + 'a' - 10);

j = Bin[i] & 0xf; 

if (j <= 9)  Hex[i * 2 + 1] = (j + '0');

else  Hex[i * 2 + 1] = (j + 'a' - 10);

};

Hex[HASHHEXLEN] = '\0';

};


/* calculate H(A1) as per spec */

void DigestCalcHA1(

IN char * pszAlg,

IN char * pszUserName,

IN char * pszRealm,

IN char * pszPassword,

IN char * pszNonce,

IN char * pszCNonce,

OUT HASHHEX SessionKey

)

{

MD5_CTX Md5Ctx;

HASH HA1;

MD5Init(&Md5Ctx);

MD5Update(&Md5Ctx, (unsigned char*)pszUserName, strlen(pszUserName));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszRealm, strlen(pszRealm));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszPassword, strlen(pszPassword));

MD5Final(&Md5Ctx,(unsigned char*)HA1);

if (strcmp(pszAlg, "md5-sess") == 0) {

MD5Init(&Md5Ctx);

MD5Update(&Md5Ctx, (unsigned char*)HA1, HASHLEN);

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszNonce, strlen(pszNonce));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszCNonce, strlen(pszCNonce));

MD5Final(&Md5Ctx, (unsigned char*)HA1);

};

CvtHex(HA1, SessionKey);

};


/* calculate request-digest/response-digest as per HTTP Digest spec */

void DigestCalcResponse(

IN HASHHEX HA1, /* H(A1) */

IN char * pszNonce, /* nonce from server */

IN char * pszNonceCount, /* 8 hex digits */

IN char * pszCNonce, /* client nonce */

IN char * pszQop, /* qop-value: "", "auth", "auth-int" */

IN char * pszMethod, /* method from the request */

IN char * pszDigestUri, /* requested URL */

IN HASHHEX HEntity, /* H(entity body) if qop="auth-int" */

OUT HASHHEX Response /* request-digest or response-digest */

)

{

MD5_CTX Md5Ctx;

HASH HA2;

HASH RespHash;

HASHHEX HA2Hex;

// calculate H(A2)

MD5Init(&Md5Ctx);

MD5Update(&Md5Ctx, (unsigned char*)pszMethod, strlen(pszMethod));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszDigestUri, strlen(pszDigestUri));

if (strcmp(pszQop, "auth-int") == 0) {

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)HEntity, HASHHEXLEN);

};

MD5Final(&Md5Ctx, (unsigned char*)HA2);

CvtHex(HA2, HA2Hex);

// calculate response

MD5Init(&Md5Ctx);

MD5Update(&Md5Ctx, (unsigned char*)HA1, HASHHEXLEN);

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszNonce, strlen(pszNonce));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

if (*pszQop) {

MD5Update(&Md5Ctx, (unsigned char*)pszNonceCount, strlen(pszNonceCount));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszCNonce, strlen(pszCNonce));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

MD5Update(&Md5Ctx, (unsigned char*)pszQop, strlen(pszQop));

MD5Update(&Md5Ctx, (unsigned char*)":", 1);

};

MD5Update(&Md5Ctx, (unsigned char*)HA2Hex, HASHHEXLEN);

MD5Final(&Md5Ctx, (unsigned char*)RespHash);

CvtHex(RespHash, Response);

};



测试例子

#include <string>

#include <iostream>

#include "digcalc.h"


using namespace std;


int main()

{

char * pszNonce = "6a0b8f835608eea4f39550723102660b:1503972485455";

char * pszCNonce = "bda3fcdddabaeb5ae9dd14b45fba9adb";

char * pszUser = "admin";

char * pszRealm = "test1.1.2";

char * pszPass = "admin12345";

char * pszAlg = "md5";

char szNonceCount[9] = "00000001";

char * pszMethod = "GET";

char * pszQop = "auth";

char * pszURI = "/ISAPI/Security/userCheck";

HASHHEX HA1;

HASHHEX HA2 = "";

HASHHEX Response;

DigestCalcHA1(pszAlg, pszUser, pszRealm, pszPass, pszNonce,

pszCNonce, HA1);

DigestCalcResponse(HA1, pszNonce, szNonceCount, pszCNonce, pszQop,

pszMethod, pszURI, HA2, Response);

printf("Response = %s\n", Response);


}


转载于:https://blog.51cto.com/fengyuzaitu/1960854

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

http协议之digest认证实现 的相关文章

  • java中数字与ASCII码的相互转换

    2019独角兽企业重金招聘Python工程师标准 gt gt gt code 测试demo public static void main String args int a 61 91151561 for byte b String va
  • IDEA怎么查看现在的项目使用的JDK版本? 2016年4月19日22:51

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 右键单击项目 xff0c 选择 或者直接使用F4 转载于 https my oschina net sprouting blog 670222
  • 什么是北向接口和南向接口

    Northbound Interface Southbound Interface 南向接口 xff1a 管理其他厂家网管或设备的接口 xff0c 即向下提供的接口 北向接口 xff1a 提供给其他厂家或运营商进行接入和管理的接口 xff0
  • 官网下载mysql源码

    官网下载mysql源码 xff0c 如下为具体步骤 xff1a 1 进入官网点击download页https www mysql com downloads 2 点击MySQL Community Edition进入mysql社区版下载页面
  • Vue设置button的disable属性

    表单元素有一个disable属性 xff0c 用来控制该元素是否可用 1 这个属性在HTML里只有1个值 xff0c 用法就是 lt button disable 61 34 disable 34 gt 点击 lt button gt 经实
  • 用C++进行简单的文件I/O操作

    序论 我曾发表过文件输入输出的文章 xff0c 现在觉得有必要再写一点 文件 I O 在C 43 43 中比烤蛋糕简单多了 在这篇文章里 xff0c 我会详细解释ASCII和二进制文件的输入输出的每个细节 xff0c 值得注意的是 xff0
  • VC++鼠标画圈

    int r 61 100 int x0 61 gameRect left 43 pt x int y0 61 gameRect top 43 pt y int x y double n 61 0 MoveTo x0 y0 while n l
  • matlab练习程序(求向量间的旋转矩阵与四元数)

    问题是这样 xff0c 如果我们知道两个向量v1和v2 xff0c 计算从v1转到v2的旋转矩阵和四元数 xff0c 由于旋转矩阵和四元数可以互转 xff0c 所以我们先计算四元数 我们可以认为v1绕着向量u旋转 角度到v2 xff0c u
  • 用lighttpd搭建一个简易的http服务器

    1 安装lighttpd 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 cd wget http download lighttpd net lighttpd releases
  • 结构体(对齐规则及举例)

    概念 一种数据结构 xff1b C语言中聚合数据类型的一类 xff1b 可以被声明为变量 数组 指针等 xff0c 用以实现比较复杂的数据结构 xff1b 是一系列元素的集合 xff0c 这些元素被称为结构体成员 xff1b 结构体成员需要
  • C++解析头文件-Qt自动生成信号定义

    目录 一 概述二 实现思路三 代码讲解 1 类图2 QtCppDescription3 测试四 源代码 一 概述 上一篇文章C 43 43 解析头文件 Qt自动生成信号声明我们主要讲解了怎么去解析C 43 43 头文件 xff0c 然后在指
  • VC++6.0与VS2010的区别

    区别1 字符串的表达 void CMy123Dlg OnBnClickedButton1 MessageBox 34 你好 34 以前VC6 0写法 现在用不了 老版本用的多字节字符集 MessageBox L 34 你好 34 L 是 u
  • 存储过程出现ORA-06508错误

    一个存储过程平时执行正常 xff0c 刚才执行出ORA 06508错误 百思不得其解 xff0c 好像没有什么不正常的地方啊 xff01 后来找到了答案 重现这个错误如下 xff1a 执行一个存储过程 xff0c 其运行时间比较长 刚开始运
  • 从零构建TCP/IP协议

    从零构建TCP IP协议 这次叫PCT协议 这篇博客是读完 图解TCP IP协议 和 TCP IP协议详解卷一 xff1a 协议 之后的总结 我从0构建了一个可靠的双工的有序的基于流的协议 xff0c 叫做PCT协议 OSI七层模型和TCP
  • c语言 checksum,crc校验方法,用c语言实现源代码(CRC checksum method, using C language source code).doc...

    crc校验方法 用c语言实现源代码 CRC checksum method using C language source code crc校验方法 用c语言实现源代码 CRC checksum method using C languag
  • arm: 使用结构体操作寄存器

    使用结构体操作 寄存器 xff1a 寄存器赋值和取值的时候 xff0c 要注意寄存器的长度 xff0c 有的寄存器的值只有8位 还要注意 xff0c 使用volatile修饰寄存器变量 volatile 参考http www cnblogs
  • 基于嵌入式操作系统VxWorks的多任务并发程序设计(5)――中断与任务

    基于嵌入式操作系统 VxWorks 的多任务并发程序设计 xff08 5 xff09 中断与任务 作者 xff1a 宋宝华 e mail email 21cnbao 64 21cn com email 出处 xff1a 软件报 中断处理是整
  • 四旋翼电池、电机、螺旋桨选型与搭配(转)

    源 xff1a 四旋翼电池 电机 螺旋桨选型与搭配
  • 《C++ Primer Plus》第3章 处理数据 学习笔记

    C 43 43 的基本类型分为两组 xff1a 一组由存储为证书的值组成 xff0c 另一组由存储为浮点格式的值组成 整型之间通过存储键值时使用的呢存及有无符号来区分 整型从最小到最大依次是 xff1a bool char signed c
  • Microbit  Turnipbit  孩子也能做的声光控开关

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 最近一直在研究Turnipbit这块板子 xff0c 之前也做了几个小实验 xff0c 研究了下针脚 xff0c 发现光敏传感器和声音传感器针脚能对的上 xff0c 就做了

随机推荐

  • 串口通信的三种方式(查询、中断、DMA)

    PC机串口定义如下图 xff1a 一般的单片机串口应用只需3根信号线 xff1a 3脚TXD xff08 发送数据 xff09 2脚RXD xff08 接收数据 xff09 5脚SG xff08 信号地 xff09 其中单片机的TXD对应连
  • SQL SERVER 大小写敏感问题

    SQL SERVER大小写敏感问题 xff0c 其实是两个问题 xff1a 标识符 xff0c 例如表名和字段名 xff0c 是否区分大小写 xff1b 字符型字段进行比较时 xff0c 是否区分大小写 第一个问题 与SQL SERVER数
  • tcpreplay,tcprewrite

    安装指南 tcpreplay官方提供的下载地址为 http tcpreplay synfin net trac wiki Download 由于tcpreplay依赖libpcap库 所以安装tcpreplay之前必须先安装libpcap
  • 本文详解5G是个什么鬼,程序员都准备好了吗?

    无线移动通讯发展历史 最近5G的概念炒的如火如荼 xff0c 为此 xff0c 华为和高通还干了一仗 这篇文章从技术层面给大家分析 xff0c 什么是5G xff0c 它和4G比 xff0c 高级在哪里 xff1f 我们来看看移动互联网的技
  • python 调用 shell 时 设置环境变量

    2019独角兽企业重金招聘Python工程师标准 gt gt gt python调用shell 不设置shell的环境变量时 xff0c 对于中文等特殊字符会处理失败 xff0c 这时需要设置环境变量 调用shell xff0c 这里使用
  • 常用的ROS命令

    在这里记一下 xff0c 以免以后忘记了 打开ros master xff1a roscore 查看topic列表 xff1a rostopic list v 打印topic内容 xff1a rostopic echo topic 将bag
  • Rational Rose正逆向工程(类图转Java代码,Java代码转类图)

    xfeff xfeff 一 xff0c 正向工程 1 设置默认语言为Java xff0c Tools gt Options gt Notation gt default xff1a 选择Java 2 设置环境变量ClassPath xff0
  • Linux 下编译安装OpenCV

    Cmake的安装 OpenCV 2 2以后版本需要使用Cmake生成makefile文件 xff0c 因此需要先安装cmake ubuntu下安装cmake比较简单 xff0c apt get install cmake 如果觉得自带的版本
  • Python模块整理(三):子进程模块subprocess

    本来收集整理网络上相关资料后整理 xff1a 从python2 4版本开始 可以用subprocess这个模块来产生子进程 并连接到子进程的标准输入 输出 错误中去 xff0c 还可以得到子进程的返回值 subprocess意在替代其他几个
  • access$000方法和JAVA内部类的反编译

    反编译了几个内部类 xff0c 看到有对外部类access 000 access 100 access 200等方法的调用代码 xff0c 但反编译外部类时 xff0c 却看不到这些代码 这涉及到JAVA编译器中对内部类的处理方式 为了让内
  • c语言中寄存器设置方法,C 编程之——寄存器赋值操作

    通过这段时间的工作和学习 xff0c 我感觉在嵌入式硬件编程中 xff0c 大多数情况下都是对相应硬件的功能寄存器进行设置和操作 一 寄存器的设置和操作特性 1 xff0c 一个寄存器的每个位有其不同的意义 xff0c 进行不同的设置会使硬
  • 室内无人机全自动巡逻系统,或比固定摄像头省钱

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 两家欧洲公司开发了世界上第一款室内无人机监视自动巡逻系统 xff0c 可以实时转播录像 xff0c 并在发现入侵者时发出警报 无人机会在它所监测的建筑物的走廊和房间按照预定
  • 电子设计大赛可以用linux开发板嘛,【一转再转】电子设计大赛应该怎么准备?...

    最主要的是学习什么课程 电工电路基础 低频电子线路 数字电路 高频电子线路 电子测量 智能仪器原理及应用 传感器技术 电机与电气控制 信号与系统 单片机接口原理及应用 等等 所要学习的科目当然不能定局 xff0c 知识面越广越好 xff0c
  • px4固定翼无人机姿态控制理解

    学习px4代码也有一段时间了 xff0c 所以想写一写 xff0c 自己的一些学习心得吧 xff0c 也算是笔记吧 在px4这套代码中 xff0c 每一个功能都是一个模块 xff0c 例如姿态控制 xff0c 也就是一个应用程序 xff0c
  • PHP 模拟 HTTP 摘要认证(Digest )

    lt php header 34 Content type text html charset 61 utf 8 34 php摘要认证 users 61 39 dee 39 61 gt 39 123456 39 39 admin 39 61
  • c语言中strcat函数的作用,strcat函数的作用是什么?

    strcat函数的作用是复制一个字符串 xff0c 将这个字符串拼接在另一个字符串后面 strcat 函数接受两个字符串作为参数 xff0c 会把第二个字符串的备份附加在第一个字符串末尾 xff0c 并把拼接后形成的新字符串作为第一个字符串
  • 带参数宏定义和函数的区别

    define S a b a b area 61 S 3 2 int S int a int b int s s 61 a b return s 这两个有什么区别 define S a b a b area 61 S 3 2 尽量少使用宏定
  • http协议调试代理工具Fiddler

    Fiddler是一款WEB调试工具 它可以记录所有客户端到服务器端的HTTP请求 Fiddler启动时 会默认代理IE浏览器的127 0 0 1 8888 其它浏览器则要手动设置 工作原理 Fiddler是以代理WEB服务器的形式工作的 它
  • Windows脚本中等待几秒的替代方法

    用ping命令实现等待 等待的秒数可以用 n 参数来控制 如果要等待10秒 xff0c 参数是 n 11 ping n 11 127 0 0 1 gt nul 64 more 64 来自 ITPUB博客 xff0c 链接 xff1a htt
  • http协议之digest认证实现

    参考 http blog csdn net jszj article details 8918967 https wenku baidu com view 22be2dcf83d049649b6658ff html http blog cs