百度到的论文已给出算法。

flag为1为解密,flag为0是加密。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Rotl(_x,_y) ((_x)<<(_y)|(_x)>>(32-(_y)))
#define SboxTrans(_A) (Sbox[(_A)>>24&0xFF]<<24|Sbox[(_A)>>16&0xFF]<<16|Sbox[(_A)>>8&0xFF]<<8|Sbox[(_A)&0xFF])
#define L1(x) ((x)^Rotl(x,2)^Rotl(x,10)^Rotl(x,18)^Rotl(x,24))
#define L2(x) ((x)^Rotl(x,13)^Rotl(x,23))
const unsigned int CK[] = {
0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };
const unsigned int RK[]={0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC};
const unsigned char Sbox[] = {
0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,
0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,
0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,
0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,
0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,
0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,
0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48
};
//const unsigned int Rotl(unsigned int n,int b){ return n<<b|n>>(32-b); }
unsigned int xx[];
void SM4KeyExt(unsigned int *key,unsigned int *rk, unsigned int CryptFlag){//秘钥扩展算法,flag为1代表解密
unsigned int r,tmp,k0,k1,k2,k3;
k0=key[]^RK[];
k1=key[]^RK[];
k2=key[]^RK[];
k3=key[]^RK[];
for(r=;r<;r+=){
/*rk(i) = k(4+i) = k(i) xor T[k(i+1) xor k(i+2) xor k(i+3) xor CK(i)]*/
/*合成置换T的过程包括非线性变换(ByteSub函数,从SBox中查找)和线性变换(L2函数,移位和异或运算)*/
tmp=k1^k2^k3^CK[r+];
tmp=SboxTrans(tmp);
k0=k0^L2(tmp);
rk[r+]=k0; tmp=k2^k3^k0^CK[r + ];
tmp=SboxTrans(tmp);
k1=k1^L2(tmp);
rk[r+]=k1; tmp= k3^k0^k1^CK[r+];
tmp=SboxTrans(tmp);
k2=k2^L2(tmp);
rk[r+]=k2; tmp=k0^k1^k2^CK[r + ];
tmp=SboxTrans(tmp);
k3=k3^L2(tmp);
rk[r+]=k3;
}
if(CryptFlag==){
for(r=;r<;r++) swap(rk[r],rk[-r]);
}
} void SM4Crypt(unsigned int *Input, unsigned int *Output, unsigned int *rk){
unsigned int r, tmp, x0, x1, x2, x3, *y;
y=(unsigned int *)Input;
x0=y[];
x1=y[];
x2=y[];
x3=y[];
for (r=;r<;r+=){
/*x4 = x0 ^ T(x1 ^ x2 ^ x3 ^ rk[0])*/
tmp=x1^x2^x3^rk[r+];
tmp=SboxTrans(tmp);
x0^=L1(tmp);
xx[r+]=x0;
tmp=x2^x3^x0^rk[r+];
tmp=SboxTrans(tmp);
x1^=L1(tmp);
xx[r+]=x1;
tmp=x3^x0^x1^rk[r+];
tmp=SboxTrans(tmp);
x2^=L1(tmp);
xx[r+]=x2;
tmp=x0^x1^x2^rk[r+];
tmp=SboxTrans(tmp);
x3^=L1(tmp);
xx[r+]=x3;
}
y=(unsigned int *)Output;
/*(y0,y1,y2,y3) = (x35,x34,x33,x32)*/
y[]=x3;
y[]=x2;
y[]=x1;
y[]=x0;
} unsigned int key[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int miwen[]={0x595298c7,0xc6fd271f,0x0402f804,0xc33d3f66};
unsigned int mingwen[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int rk[];
unsigned int output[]={};
void solve1(){
printf("题目1:\n");
SM4KeyExt(key,rk,);
printf("rk数组:\n");
for(int i=;i<;i++) printf("%08x\n",rk[i]);
printf("\n");
printf("x数组:\n");
SM4Crypt(mingwen,output,rk);
for(int i=;i<;i++) printf("%08x\n",xx[i]);
printf("结果:\n");
for(int i=;i<;i++) printf("%08x ",output[i]);
printf("\n");
}
void solve2(){
printf("题目2:\n");
SM4KeyExt(key,rk,);
for(int i=;i<;i++){
SM4Crypt(mingwen,mingwen,rk);
}
for(int i=;i<;i++) cout<<hex<<mingwen[i]<<" ";
cout<<"\n";
}
int main(){
//freopen("out.txt","w",stdout);
solve1();
solve2();
return ;
}

将模板缩减了一下,sbox的结果是unsigned char,进行移位运算之后是int,SboxTrans的结果为int,右移是算术右移导致出错,最好分开写或者强转。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Rotl(_x,_y) ((_x)<<(_y)|(_x)>>(32-(_y)))
#define SboxTrans(_A) (Sbox[(_A)>>24&0xFF]<<24|Sbox[(_A)>>16&0xFF]<<16|Sbox[(_A)>>8&0xFF]<<8|Sbox[(_A)&0xFF])
#define L1(x) ((x)^Rotl(x,2)^Rotl(x,10)^Rotl(x,18)^Rotl(x,24))
#define L2(x) ((x)^Rotl(x,13)^Rotl(x,23))
const unsigned int CK[] = {
0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };
const unsigned int RK[]={0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC};
const unsigned char Sbox[] = {
0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,
0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,
0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,
0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,
0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,
0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,
0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48
};
//const unsigned int Rotl(unsigned int n,int b){ return n<<b|n>>(32-b); }
unsigned int xx[];
void SM4KeyExt(unsigned int *key,unsigned int *rk, unsigned int CryptFlag){//秘钥扩展算法,flag为1代表解密
unsigned int r,tmp,k[];
for(int i=;i<;i++) k[i]=key[i]^RK[i];
for(int i=;i<;i+=){
for(int j=;j<;j++){
tmp=SboxTrans(k[(j+)%]^k[(j+)%]^k[(j+)%]^CK[i+j]);
rk[i+j]=k[j]^=L2(tmp);
}
}
if(CryptFlag==) for(r=;r<;r++) swap(rk[r],rk[-r]); } void SM4Crypt(unsigned int *Input, unsigned int *Output, unsigned int *rk){
unsigned int tmp, x[], *y;
y=(unsigned int *)Input;
for(int i=;i<;i++) x[i]=y[i];
for(int i=;i<;i+=){
for(int j=;j<;j++){
tmp=SboxTrans(x[(j+)%]^x[(j+)%]^x[(j+)%]^rk[i+j]);//为什么这样就好了?
x[j]^=L1(tmp);
xx[i+j]=x[j];
}
}
y=(unsigned int *)Output;
for(int i=;i<;i++) y[i]=x[-i];
} unsigned int key[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int miwen[]={0x595298c7,0xc6fd271f,0x0402f804,0xc33d3f66};
unsigned int mingwen[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int rk[];
unsigned int output[]={};
void solve1(){
printf("题目1:\n");
SM4KeyExt(key,rk,);
printf("rk数组:\n");
for(int i=;i<;i++) printf("%08x\n",rk[i]);
printf("\n");
printf("x数组:\n");
SM4Crypt(mingwen,output,rk);
for(int i=;i<;i++) printf("%08x\n",xx[i]);
printf("结果:\n");
for(int i=;i<;i++) printf("%08x ",output[i]);
printf("\n");
}
void solve2(){
printf("题目2:\n");
SM4KeyExt(key,rk,);
for(int i=;i<;i++){
SM4Crypt(mingwen,mingwen,rk);
}
for(int i=;i<;i++) cout<<hex<<mingwen[i]<<" ";
cout<<"\n";
}
int main(){
//freopen("out.txt","w",stdout);
solve1();
solve2();
return ;
}

坑爹的错误

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define Rotl(_x,_y) ((_x)<<(_y)|(_x)>>(32-(_y)))
#define SboxTrans(_A) (Sbox[(_A)>>24&0xFF]<<24|Sbox[(_A)>>16&0xFF]<<16|Sbox[(_A)>>8&0xFF]<<8|Sbox[(_A)&0xFF])
#define L1(x) ((x)^Rotl(x,2)^Rotl(x,10)^Rotl(x,18)^Rotl(x,24))
#define L2(x) ((x)^Rotl(x,13)^Rotl(x,23))
const unsigned int CK[] = {
0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279 };
const unsigned int RK[]={0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC};
const unsigned char Sbox[] = {
0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,
0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,
0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,
0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,
0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,
0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,
0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48
};
//const unsigned int Rotl(unsigned int n,int b){ return n<<b|n>>(32-b); }
unsigned int xx[];
void SM4KeyExt(unsigned int *key,unsigned int *rk, unsigned int CryptFlag){//秘钥扩展算法,flag为1代表解密
unsigned int r,tmp,k[];
for(int i=;i<;i++) k[i]=key[i]^RK[i];
for(int i=;i<;i+=){
for(int j=;j<;j++){
k[j]^=L2((unsigned int)SboxTrans(k[(j+)%]^k[(j+)%]^k[(j+)%]^CK[i+j]));
rk[i+j]=k[j];
}
}
if(CryptFlag==) for(r=;r<;r++) swap(rk[r],rk[-r]); } void SM4Crypt(unsigned int *Input, unsigned int *Output, unsigned int *rk){
unsigned int tmp, x[], *y;
y=(unsigned int *)Input;
for(int i=;i<;i++) x[i]=y[i];
for(int i=;i<;i+=){
for(int j=;j<;j++){
x[j]^=L1((unsigned int)SboxTrans(x[(j+)%]^x[(j+)%]^x[(j+)%]^rk[i+j]));
xx[i+j]=x[j];
}
}
y=(unsigned int *)Output;
for(int i=;i<;i++) y[i]=x[-i];
} unsigned int key[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int miwen[]={0x595298c7,0xc6fd271f,0x0402f804,0xc33d3f66};
unsigned int mingwen[]={0x01234567,0x89abcdef,0xfedcba98,0x76543210};
unsigned int rk[];
unsigned int output[]={};
void solve1(){
printf("题目1:\n");
SM4KeyExt(key,rk,);
printf("rk数组:\n");
for(int i=;i<;i++) printf("%08x\n",rk[i]);
printf("\n");
printf("x数组:\n");
SM4Crypt(mingwen,output,rk);
for(int i=;i<;i++) printf("%08x\n",xx[i]);
printf("结果:\n");
for(int i=;i<;i++) printf("%08x ",output[i]);
printf("\n");
}
void solve2(){
printf("题目2:\n");
SM4KeyExt(key,rk,);
for(int i=;i<;i++){
SM4Crypt(mingwen,mingwen,rk);
}
for(int i=;i<;i++) cout<<hex<<mingwen[i]<<" ";
cout<<"\n";
}
int main(){
//freopen("out.txt","w",stdout);
solve1();
solve2();
return ;
}

SM4算法的c++实现的更多相关文章

  1. sm4算法(附源码、测试代码)

    from:http://blog.csdn.net/mao0514/article/details/52930944 SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳 ...

  2. SM4密码算法(附源码)

    SM4是我们自己国家的一个分组密码算法,是国家密码管理局于2012年发布的.网址戳→_→:http://www.cnnic.NET.cn/jscx/mixbz/sm4/ 具体的密码标准和算法官方有非常 ...

  3. 关于国密算法 SM1,SM2,SM3,SM4 的笔记

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...

  4. SM系列国密算法(转)

    原文地址:科普一下SM系列国密算法(从零开始学区块链 189) 众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7. ...

  5. Java国密相关算法(bouncycastle)

    公用类算法: PCIKeyPair.java /** * @Author: dzy * @Date: 2018/9/27 14:18 * @Describe: 公私钥对 */ @Data @AllAr ...

  6. 2017-2018-2 20179207 《网络攻防技术》第十三周作业 python3实现SM234算法

    国密算法SM234 的python3实现 国家标准 GM/T 0002-2012 <SM4分组密码算法> GM/T 0003.1-2012 <SM2椭圆曲线公钥密码算法 第1部分:总 ...

  7. 2017-2018-2 20179204《网络攻防实践》第十三周学习总结 python实现国密算法

    国密商用算法是指国密SM系列算法,包括基于椭圆曲线的非对称公钥密码SM2算法.密码杂凑SM3算法.分组密码SM4算法,还有只以IP核形式提供的非公开算法流程的对称密码SM1算法等. 第1节 SM2非对 ...

  8. 【原创】SM4password算法源代码接口具体解释

    [原创]SM4password算法源代码接口具体解释 近期几天想把cryptdb的加密算法换成国产的sm4加密算法.所以花了时间研究了一下sm4的源代码和基本原理,避免忘记,写下这篇博客以作记录. 先 ...

  9. OpenSSL 1.1.1 国密算法支持

    OpenSSL 1.1.1 国密算法支持 https://www.openssl.org/ https://github.com/openssl/openssl OpenSSL 1.1.1 新特性: ...

随机推荐

  1. 用cocos2d-html5做的消除类游戏《英雄爱消除》(3)——游戏主界面

    游戏主界面,同时也是主程序,包括sprite的生成加入以及游戏状态的控制. 下面同样贴下源码再讲解; /** * Power by html5中文网(html5china.com) * author: ...

  2. 斯坦福机器学习视频笔记 Week2 多元线性回归 Linear Regression with Multiple Variables

    相比于week1中讨论的单变量的线性回归,多元线性回归更具有一般性,应用范围也更大,更贴近实际. Multiple Features 上面就是接上次的例子,将房价预测问题进行扩充,添加多个特征(fea ...

  3. vim配置与使用

    Vim 是一个上古神器,本篇文章主要持续总结使用 Vim 的过程中不得不了解的一些指令和注意事项,以及持续分享一个前端工作者不得不安装的一些插件,而关于 Vim 的简介,主题的选择,以及为何使用 vi ...

  4. ELK初步指南

    ELK的简单科普文章,加入了自己的一些理解. 内容包括ELK的基本介绍, 应用场景, 架构设计, 监控及自监控, 业界进展及推荐资料等. 用户故事 场景一 作为一个运维工程师, 某天虚拟机出现故障, ...

  5. 算法(Algorithms)第4版 练习 1.3.31

    双向链表实现: //1.3.31 package com.qiusongde.linkedlist; public class DoublyLinkedList<Item> { priva ...

  6. 如何搭建一个GitHub在自己的服务器上?

    摘自:http://blog.csdn.net/yangzhenping/article/details/43937595

  7. plsql点击不再提示后需重新提示

    工具--首选项---用户界面---选项---DSA对话框---内容如下 ;显示含有“不再显示这个信息”的对话框;你可以删除用于你要启用的信息的行 CharSetMismatch@RIM40=1Char ...

  8. php 数组分页

    $p = max(1, I('param.p',1,'intval')); $count = count($date); $Page = new Page($count,15); $Page-> ...

  9. 修改(python) mysql 数据库 使其可以支持插入中文

    先建立一个数据库,名字叫xsk #!/usr/bin/python3 # -*- coding:utf-8 -*- import pymsql # 打开数据库连接(本机,用户,密码,数据库名) db ...

  10. UI层自动化测试介绍

    UI指的是用户可以用肉眼可以看到的页面. UI层自动化测试的原理.不论是web端还是移动端,原理都是一样的,就是基于页面元素的识别和定位来进行模拟用户行为. 首先识别到某个元素,比如一个按钮,然后定义 ...