算法加密与解密、字符集、编码方式

news2024/11/19 19:44:27

加密算法

加密保证数据不会被窃取或者修改

不可逆加密算法

哈希算法

压缩映射:散列又称为哈希,是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。

哈希算法(Hash)又称摘要算法(Digest),哈希算法的目的就是为了验证原始数据是否被篡改。

主流的散列算法有MD5和SHA-1,其主要任务是验证数据的完整性

散列算法特色算法

  1. 固定大小:散列函数能够接收任意大小数据,并输出固定大小散列值,MD5获得的散列值大小是128bit,SHA-1获得的散列值大小是160bit
  2. 雪崩效应:原始数据只要修改,计算获得的散列值将会发生巨大变化
  3. 单向:只可能从原始数据计算获得散列值,不可能从散列值恢复数据
  4. 冲突避免:几乎不能找到另一个数据和当前数据计算的散列值相同,所以散列函数能确保数据的惟一性

一个字节是8位: 

二进制8位:xxxxxxxx ,范围:00000000-11111111,表示0到255。

一位16进制数(0-F),用二进制表示是xxxx,范围:0000 - 1111,表示:0到16

1个字节=2个16进制字符


MD5算法

Java 中,java.security.MessageDigest 中已经定义了 MD5 的计算,我们只需要简单地调用即可得到 MD5 的128 位整数,然后将此 128 位计 16 个字节转换成 16 进制表示即可。

public class Net {
    public static char hexDigits[]={'0','1','2','3','4','5','6','7','8','9',
            'A','B','C','D','E','F','G',
            'H','I','J','K','L','M','N',
            'O','P','Q','R','S','T',
            'U','V','W','X','Y','Z'};



    public static void main(String[] args) throws Exception {
        // 创建一个MessageDigest实例
        MessageDigest md = MessageDigest.getInstance("MD5");
        // 反复调用update输入数据
        md.update("心有猛虎,细嗅蔷薇".getBytes("UTF-8"));
        //MD5 的计算结果是一个128位的长整数
        byte[] result = md.digest();

//16进制字符串形式密文(方式一)----------------------------------------------------------
        System.out.println(new BigInteger(1, result).toString(16));

//16进制字符串形式密文(方式二)----------------------------------------------------------
        //把密文转换成16进制字符串的形式
        int j = result.length;
        char str[] = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
            byte byte0 = result[i];
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        System.out.println(str);

//16进制字符串形式密文(方式三)----------------------------------------------------------
        //这时需要一个StringBuffer来存储转译后的加密字符
        StringBuffer sb = new StringBuffer();
        //加密通常使用十六进制字符加密
        char[] chars = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a',
                'b', 'c', 'd', 'e', 'f', };
        //转换为16进制字符串
        for(byte b:result){
            sb.append(chars[(b >> 4) & 15]);
            sb.append(chars[b & 15]);
        }
        System.out.println(sb.toString());
    }
}

运行结果

彩虹表:一个预先计算好的常用口令和它们的MD5的对照表

采取措施来抵御彩虹表攻击,方法是对每个口令额外添加随机数,这个方法称之为加盐(salt):

加盐的目的在于使黑客的彩虹表失效,即使用户使用常用口令,也无法从MD5反推原始口令

 加盐Salt加密

在原始密码密文的基础之上,再加入一个随机字符串,从而达到让用户的密码更复杂的效果。这个随机字符串,便是盐。

//3、密码加密
//生成盐
String salt = UUID.randomUUID().toString().substring(0,8);
//MD5加密相同的字符串加密后的结果一样 ,所以md5会结合加盐保证安全
String endcodePwd = DigestUtils.md5Hex(DigestUtils.md5Hex(password)+salt);
userEntity.setSalt(salt);
userEntity.setPassword(endcodePwd);
//初始化用户的默认值
byte[] encode = Base64.getEncoder().encode(("谷粉" + UUID.randomUUID().toString().substring(0, 8)).getBytes());
userEntity.setNickname(new String(encode));
userEntity.setCreateTime(new Date());
userEntity.setIntegration(0);
userEntity.setGrowth(0);
userEntity.setLevelId(1L);
userEntity.setStatus(1);
//4、保存到数据库
this.save(userEntity);

注意:salt我们也存储了 


SHA-1算法

SHA算法实际上是一个系列,包括SHA-0(已废弃)、SHA-1、SHA-256、SHA-512等。在Java中使用SHA-1,和MD5完全一样,只需要把算法名称改为"SHA-1"

单向散列函数的安全性在于其产生散列值的操作过程具有较强的单向性。如果在输入序列中嵌入密码,那么任何人在不知道密码的情况下都不能产生正确的散列值,从而保证了其安全性

数字签名

通过散列算法可实现数字签名实现,数字签名的原理是将要传送的明文通过一种函数运算(Hash)转换成报文摘要(不同的明文对应不同的报文摘要),报文摘要加密后与明文一起传送给接受方,接受方将接受的明文产生新的报文摘要与发送方的发来报文摘要解密比较,比较结果一致表示明文未被改动,如果不一致表示明文已被篡改。

public class Net {
    public static char hexDigits[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
            'a', 'b', 'c', 'd', 'e', 'f'};


    public static void main(String[] args) throws Exception {
        // 创建一个MessageDigest实例
        MessageDigest md = MessageDigest.getInstance("SHA1");
        // 反复调用update输入数据
        md.update("helloworld".getBytes("UTF-8"));
        //MD5 的计算结果是一个128位的长整数
        byte[] result = md.digest();

//16进制字符串形式密文(方式一)----------------------------------------------------------
        //把密文转换成16进制字符串的形式
        int j = result.length;
        char str[] = new char[j * 2];
        int k = 0;
        for (int i = 0; i < j; i++) {
            byte byte0 = result[i];
            str[k++] = hexDigits[byte0 >>> 4 & 0xf];
            str[k++] = hexDigits[byte0 & 0xf];
        }
        System.out.println(str);

//16进制字符串形式密文(方式二)----------------------------------------------------------
        StringBuilder ret = new StringBuilder(result.length * 2);
        for (int i = 0; i < result.length; i++) {
            ret.append(hexDigits[(result[i] >> 4) & 0x0f]);
            ret.append(hexDigits[result[i] & 0x0f]);
        }
        System.out.println(ret.toString());

//16进制字符串形式密文(方式三)----------------------------------------------------------
        int i;
        StringBuffer buf = new StringBuffer("");
        for (int offset = 0; offset < result.length; offset++) {
            i = result[offset];
            if (i < 0)
                i += 256;
            if (i < 16)
                buf.append("0");
            buf.append(Integer.toHexString(i));
        }
        System.out.println(buf.toString());
    }
}

运行结果


可逆加密算法

AES对称可逆加密

AES支持三种长度的密钥:128位,192位,256位。AES128,AES192,AES256,实际上就是指的AES算法对不同长度密钥的使用。

密钥 是AES算法实现加密和解密的根本。对称加密算法之所以对称,是因为这类算法对明文的加密和解密需要使用同一个密钥。

三种填充模式

AES算法在对明文加密的时候,并不是把整个明文一股脑加密成一整段密文,而是把明文拆分成一个个独立的明文块,每一个明文块长度128bit。

NoPadding:不做任何填充,但是要求明文必须是16字节的整数倍。

PKCS5Padding(默认):如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字符,且每个字节的值等于缺少的字符数。

ISO10126Padding:如果明文块少于16个字节(128bit),在明文块末尾补足相应数量的字节,最后一个字符值等于缺少的字符数,其他字符填充随机数。

总之,AES是用来替代DES的新一代加密标准,具有128bit的分组长度,支持128、192和256比特的密钥长度

在AES中生成密钥的方法有两种:

从随机数生成

KeyGenerator类,定义一种用于生成大小为n(128、192和256)位的AES密钥的方法:

/**
 * 用于生成大小为n(128、192和256)位的AES密钥
 * @param n
 * @return
 * @throws NoSuchAlgorithmException
 */
public static SecretKey generateKey(int n) throws NoSuchAlgorithmException {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
    keyGenerator.init(n);
    SecretKey key = keyGenerator.generateKey();
    return key;
}

从给定密码生成

基于密码的密钥派生功能从给定的密码派生AES秘密密钥


DES对称可逆加密

DES加密运算、解密运算使用的是同样的密钥,信息的发送者和信息的接收者必须共同持有该密钥

明文按64位进行分组密钥长64位(56 位的密钥以及附加的 8 位奇偶校验位)。

第一步:密钥的构建

/**
 * 密钥生成器
 *
 * @return
 * @throws Exception
 */
public static byte[] initKey() throws Exception {
    KeyGenerator keyGenerator = KeyGenerator.getInstance("DES");
    //初始化密钥生成器
    keyGenerator.init(56);
    //生成密钥
    SecretKey secretKey = keyGenerator.generateKey();
    //获得密钥得二进制编码形式
    return secretKey.getEncoded();
}

返回的二进制字节数组就是我们需要的秘密密钥,方便存储在文件或者以流的方式在网路传输。

-------------------------------

第二步,把二进制密钥转为SecretKey密钥对象

 /**
  * 转换密钥
  *
  * @param key
  * @return
  * @throws Exception
  */
 private static Key generateKey(byte[] key) throws Exception {
     //实例化DES密钥材料
     DESKeySpec dks = new DESKeySpec(key);
     //创建一个密匙工厂
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
     //生成秘密密钥,并返回
     return keyFactory.generateSecret(dks);
 }

有了密钥就可以对数据加密和解密了

Cipher.getInstance("DES");可以设置为Cipher.getInstance("DES/CBC/PKCS5Padding");

分别指 "算法/工作模式/填充模式"

使用DES加密数据

/**
 * DES加密
 *
 * @param data 待加密数据
 * @param key  密钥
 * @return 加密后数据
 */
public static byte[] encrypt(byte[] data, byte[] key) throws Exception {
    //还原密钥
    Key secretKey = generateKey(key);
    //指定获取DES的Cipher对象
    Cipher cipher = Cipher.getInstance("DES");
    //初始化,设置加密模式
    cipher.init(Cipher.ENCRYPT_MODE,secretKey);
    //执行操作
    byte[] bytes = cipher.doFinal(data);
    return bytes;
}

------------------------------------------------------

使用DES解密数据

 /**
  * DES解密
  *
  * @param data 待解密数据
  * @param key  密钥
  * @return 解密后内容
  */
 public static byte[] decrypt(byte[] data, byte[] key) throws Exception {
     //还原密钥
     Key secretKey = generateKey(key);
     //实例化
     Cipher cipher = Cipher.getInstance("DES");
     //设置为解密模式
     cipher.init(Cipher.DECRYPT_MODE, secretKey);
     //执行操作
     byte[] bytes = cipher.doFinal(data);
     return bytes;
 }

测试

public static void main(String[] args) throws Exception {
    String password = "kfcKFC888888";
    byte[] key = DESUtil.initKey();//拿到密钥
    //对password加密
    byte[] encrypt = DESUtil.encrypt(password.getBytes(), key);
    System.out.println("加密后数据," +new String (encrypt,"UTF-8"));
    //对password解密
    byte[] decrypt = DESUtil.decrypt(encrypt, key);
    System.out.println("解密后数据," +new String (decrypt,"UTF-8"));
}


RSA非对称可逆加密

RSA算法是一种非对称的加密算法(即:加密、解密的密钥不同) ,通常是生成两把密钥,分别是私钥公钥,其中私钥保密,公钥对外公开。

RSA加解密过程:使用公钥将数据加密,并通过私钥对加密信息进行解密。针对我们遇到的问题,公钥放在前端对用户名密码进行加密,私钥放在服务端对前端提交的加密数据进行解密,然后在做登陆的业务操作


字符集

ASCII字符集

编码、解码

计算机底层并没有文本文件、图片文件之分,它只是记录着每个文件的二进制序列。

字符集:包含着字符和二进制序列之间的对应关系,一个字符对应一个二进制序列。

乱码:编码、解码使用的字符集不一致导致

Windows中文本文件的默认字符集是GBK。

MySQL在8.0版本之前,默认字符集为latin1,8.0版本默认字符集为utf8mb4

ISO8859-1 字符集,也就是 Latin-1,是西欧常用字符,包括德法两国的字母。

ISO8859-2 字符集,也称为 Latin-2,收集了东欧字符。

ISO8859-3 字符集,也称为 Latin-3,收集了南欧字符。

字符集(Character Set):是指多个字符的集合。不同的字符集包含的字符个数不一样、包含的字符不一样、对字符的编码方式也不一样。如:


ASCII字符集

字符编码是指一种映射规则,根据这个规则来将字符映射到相应的码点(数值)上面

ASCII字符集

ASCII字符集只包含了128字符,这个字符集收录的主要字符是英文字母、阿拉伯字母和一些简单的控制字符

ASCII 编码方式是一种固定长度的编码方式,每个字符都使用 7 位二进制编码来表示。长度为1个字节, 有符号字符型数


ASCII码对照表

ASCII码中,

第0~32号及第127号是控制字符,常用的有LF(换行)、CR(回车);

第33~126号是字符,

其中第48~57号为0~9十个阿拉伯数字;

65~90号为26个大写英文字母,

97~122号为26个小写英文字母,

其余的是一些标点符号、运算符号等

ASCII值控制字符ASCII值控制字符ASCII值控制字符ASCII值控制字符
0NUT32(space)64@96
1SOH33!65A97a
2STX34"66B98b
3ETX35#67C99c
4EOT36$68D100d
5ENQ37%69E101e
6ACK38&70F102f
7BEL39,71G103g
8BS40(72H104h
9HT41)73I105i
10LF42*74J106j
11VT43+75K107k
12FF44,76L108l
13CR45-77M109m
14SO46.78N110n
15SI47/79O111o
16DLE48080P112p
17DCI49181Q113q
18DC250282R114r
19DC351383S115s
20DC452484T116t
21NAK53585U117u
22SYN54686V118v
23TB55787W119w
24CAN56888X120x
25EM57989Y121y
26SUB58:90Z122z
27ESC59;91[123{
28FS60<92/124|
29GS61=93]125}
30RS62>94^126`
31US63?95_127DEL
特殊字符解释
NUL空VT 垂直制表SYN 空转同步
STX 正文开始CR 回车CAN 作废
ETX 正文结束SO 移位输出EM 纸尽
EOY 传输结束SI 移位输入SUB 换置
ENQ 询问字符DLE 空格ESC 换码
ACK 承认DC1 设备控制1FS 文字分隔符
BEL 报警DC2 设备控制2GS 组分隔符
BS 退一格DC3 设备控制3RS 记录分隔符
HT 横向列表DC4 设备控制4US 单元分隔符
LF 换行NAK 否定DEL 删除

Unicode字符集

Unicode字符集

Unicode 标准始终使用十六进制数字标识唯一的码点(code point),码点用于表示该字符在字符集中的位置

Unicode字符集

Unicode字符集是一个很大的字符集合,包含了世界上几乎所有的字符,用于表示人类语言、符号和表情等各种信息

为了在计算机中存储和传输 Unicode 字符集中的字符,需要使用一种编码方式。
UTF-8 UTF-16 UTF-32 都是 Unicode 字符集的编码方式,用于将 Unicode 字符集中的字符转换成字节序列,以便于存储和传输。 它们的差别在于使用的 字节长度不同

UTF-8编码

UTF-8就是在互联网上使用最广的一种Unicode的实现方式。UTF-8编码是Unicode的实现方式之一。只有 UTF-8 兼容 ASCII,UTF-32 和 UTF-16 都不兼容 ASCII,因为它们没有单字节编码

UTF-8最大的一个特点,就是它是一种可变长度的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度

UTF-8 是一种可变长度的编码方式
  1. 对于 ASCII 字符(码点范围为 0x00~0x7F ),使用一个字节表示
  2. 对于其他 Unicode 字符,使用两个、三个或四个字节表示
通常⼀个  字节=两个16进制位
过程解析:1个16进制数 = 4个⼆进制数位,2个16进制数 = 8个⼆进制数位 = 1字节

一位16进制数(用二进制表示是xxxx)最多只表示到15(即对应16进制的F)

UTF-8 使用 1 个字节表示 ASCII 字符;
UTF-8 使用 2 个字节表示带有附加符号的拉丁文、希腊文等;
UTF-8 使用 3 个字节表示其他基本多文种平面(BMP)中的字符(包含了大部分常用字,如大部分的汉字);
UTF-8 使用 4 个字节表示 Unicode 辅助平面的字符。

UTF-8 编码的规则:

在 ASCII 码范围内的代码点,UTF-8 使用 1 个字节表示。


大于 ASCII 码范围的代码点,UTF-8 使用多个字节表示。UTF-8 使用第一个字节的前几位表示该 Unicode 字符的字节长度(第一个字节的开头 1 的数目就是该 Unicode 字符的字节长度),其余字节的前两位固定为 10,作为标记


如果第一个字节的前两位为 1,第三位为 0(110xxxxx),则表示 UTF-8 使用 2 个字节表示该 Unicode 字符;
如果第一个字节的前三位为 1,第四位为 0(1110xxxx),则表示 UTF-8 使用 3 个字节表示该 Unicode 字符;
依此类推;
如果第一个字节的前四位为 1,第五位为 0(11110xxx),则表示 UTF-8 使用 4 个字节表示该 Unicode 字符;


UTF-16编码和UTF-32 编码

UTF-16 是一种固定长度的编码方式。使用 2 个或者 4 个字节来存储
对于 Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换,这跟 UTF-32 非常类似。
对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,
UTF-32 是一种固定长度的编码方式,对于所有 Unicode 字符,使用四个字节表示

GBK相关字符集

GB2312字符集

GB2312 :《信息交换用汉字编码字符集》

GB2312 是一个较为简单的字符集,只包含了常用的汉字和符号,因此对于一些较为罕见的汉字和生僻字, GB2312 不能满足需求,现在已经逐渐被 GBK GB18030 等字符集所取代
GB2312和GBK都是在 ASCII 的基础上发展起来的,它们都兼容 ASCII,

以 GB2312 为例,该字符集收录的字符较少,所以使用 1~2 个字节编码。

  • 对于 ASCII 字符,使用一个字节存储,并且该字节的最高位是 0;
  • 对于中国的字符,使用两个字节存储,并且规定每个字节的最高位都是 1。

GB2312汉字编码规则

GB2312 把每个汉字都编码成两个字节,第一个字节是高位字节,第二个字节是低位字节


GBK 字符集

GBK:《汉字内码扩展规范》

GBK 包含了 GB2312 字符集中的字符,同时还扩展了许多其他汉字字符和符号,共收录了 21,913 个字符。

GBK 编码是一种变长的编码方式,对于 ASCII 字符(码位范围为 0x00 0x7F ),使用一个字节表示,对于其他字符,使用两个字节表示。

GB18030 字符集

GB18030 全称《信息技术 中文编码字符集》 ,共收录七万多个汉字和字符, 它在 GBK 的基础上增加了中日韩语中的汉字 和 少数名族的文字及字符,完全兼容 GB2312,基本兼容 GBK


编码方式 

浏览器百分号编码

URL 只能使用 ASCII 字符集来通过因特网进行发送。由于 URL 常常会包含 ASCII 集合之外的字符,URL 必须转换为有效的 ASCII 格式。

转化格式为:URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符

浏览器提交数据时默认会使用UrlEcode对内容进行编码,tomcat服务器默认会使用UrlDecode对内容进行解码,来解决中文乱码问题

测试一:

UrlEncode编码,对acsII码表中的大部分内容不会处理

//测试UrlEncode编码:
//1、编码:对acs码表中的大部分内容不会处理
String s ="abc123456.";
String encode = URLEncoder.encode(s, "UTF-8");
System.out.println("编码后: "+encode);
//2、解码
String decode = URLDecoder.decode(encode, "UTF-8");
System.out.println("解码后: "+decode);

测试二:使用UrlEcode解决中文乱码

//测试UrlEncode编码:
//1、编码:UTF-8的中文会转为三个%组成的字符串
String s ="http://localhost:8080?keyword=华为手机";
String encode = URLEncoder.encode(s, "UTF-8");
System.out.println("编码后: "+encode);
//2、解码
String decode = URLDecoder.decode(encode, "UTF-8");
System.out.println("解码后: "+decode);


Base64编码

jwt: jwt将载荷头 签名 使用Base64的算法处理后得到一个可读的字符串

base64:提供了64个字符
    a~z  A~Z   0~9   /  +       = 保留字符 不解析
    以后需要base64处理的字符串,每个字符只要可以转为64个字符的某一个就没有乱码
 
base64将数据转为字节数组,每3个字节重新分为一组,如果一组不足三个使用=补齐
再将三个字节拆分为4个字节,并在高位补充0

//1 byte = 8bit
         [ 1010 0101 ]  [ 1110 0101 ]  [ 0010 0101 ]
拆分后    [ 00 1010 01 ]  [ 00 01 1110  ]  [ 00 0101 00 ] [00 10 0101]

处理后每个字节最大是00 1111 11    取值范围一共有64种可能,每一个值对应base64提供的码表中的一个字符 a~z  A~Z   0~9   /  +

String s = "金三银四?";
byte[] encode = Base64.getEncoder().encode(s.getBytes("UTF-8"));
String s1 = new String(encode);
System.out.println("base64编码后:"+s1);
byte[] decode = Base64.getDecoder().decode(s1);
String s2 = new String(decode);
System.out.println("解码后: "+s2);

如果把字符串改为:

String s = "金三银四a";

如果把字符串改为:

String s = "金三银四ab";

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/516826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

相比欧美国家,国内开发软件外包项目的优势

软件开发在全球都有需求&#xff0c;尤其是欧美发达国家&#xff0c;不管是什么样的技术革命都离不开计算机软件的配套开发。另一方面欧美国家技术人员少且成本也比较高&#xff0c;相应的国内技术人员多而且技术全面&#xff0c;成本也低&#xff0c; 因此在国内找软件外包开发…

Hello, Mojo——首次体验Mojo语言

Hello, Mojo——首次体验Mojo语言 文章目录 Hello, Mojo——首次体验Mojo语言一、前言二、Mojo有哪些独特的功能使它不同于Python&#xff1f;三、可以在 Mojo 中导入和使用的 Python 哪些包&#xff1f;四、为什么参数化在 Mojo 中对于使用 SIMD 类型和硬件加速器很重要&#…

PowerShell install 一键部署TortoiseSVN

TortoiseSVN TortoiseSVN是 Subversion 版本控制系统的一个免费开源客户端&#xff0c;可以超越时间的管理文件和目录。文件保存在中央版本库&#xff0c;除了能记住文件和目录的每次修改以外&#xff0c;版本库非常像普通的文件服务器。你可以将文件恢复到过去的版本&#x…

玩机搞机--定制系统 编译系统选项 隐藏设置 关闭app联网 增加设置选项【一】

在接待一些定制rom的过程中。对于有些客户的有些要求作出对应的系统编译操作选项。例如 增减手机设置中的某些选项。 &#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&#x1f494;&am…

Druid 任意文件读取 (CVE-2021-36749)

漏洞原理 在Apache Druid系统中&#xff0c;InputSource用于从某个数据源读取数据。由于没有对用户可控的HTTP InputSource做限制&#xff0c;ApacheDruid 允许经过身份验证的用户以Druid服务器进程的权限从指定数据源读取数据&#xff0c;包括本地文件系统。攻击者可通过将文…

银河麒麟系统Arm64 编译Gdal

银河麒麟系统Arm64 编译Gdal GDAL 官网下载版本&#xff1b;我这边下载的是2.4.2 Download — GDAL documentation 拷贝到麒麟用户目录下&#xff1b;并解压 打开命令行&#xff1b;输入 make -j4 四线程编译 编译完成后输入 make install 完成后&#xff1b;此时的gdal.so会自…

windows系统下利用Nginx搭建rtmp流媒体服务器

windows系统利用Nginx搭建rtmp流媒体服务器 目录 windows系统利用Nginx搭建rtmp流媒体服务器1、介绍2、安装部署nginx3、安装部署ffmpeg实现推拉流 1、介绍 Nginx是一个高性能的HTTP和反向代理web服务器&#xff0c;并且支持rtmp&#xff0c;不过rtmp是作为一个nginx的一个模块…

DeepLab v3

Rethinking Atrous Convolution for Semantic Image Segmentation Chen L C, Papandreou G, Schroff F, et al. Rethinking atrous convolution for semantic image segmentation[J]. arXiv preprint arXiv:1706.05587, 2017. 重新思考空洞卷积用于语义图像分割 摘要 在本工作…

MySQL视图详解

我写本文主要目的&#xff0c;是在网上看见了 所以&#xff0c;文本主要探讨的问题如下&#xff0c;验证结果在最后面 一、修改视图&#xff0c;基表会跟着改吗&#xff1f;答案&#xff1a;会改变 二、修改基表&#xff0c;视图会变化吗&#xff1f;答案&#xff1a;会改变 …

AI孙燕姿项目实现

最近在b站刷到很多关于ai孙笑川唱的歌曲&#xff0c;加上最近大火的ai孙燕姿&#xff0c; 这下“冷门歌手”整成热门歌手了 于是写下一篇文章&#xff0c; 如何实现属于的ai歌手。 注意滥用ai&#xff0c;侵犯他人的名誉是要承担法律责任的 下面是一些所需的文件链接&#xff…

教你轻松玩转-ChatGPT或生成类大模型--助你成为未来高端黄金职业人

文章目录 1、前言2、大模型--巴拉巴拉小魔仙3、巴拉巴拉小魔仙-指导方向3、二次元美女或科幻图-魔法4、Cosplay-魔法5、魔法师5.1、系统消息5.2、小样本学习5.3、非对话场景5.4、使用明确的指令5.5、最后重复一遍指令5.5、对输出的操作5.6、添加语法5.7、把任务分解5.8、思维链…

如何开发网上独立商城?

互联网快速发展时代&#xff0c;越来越多的商家选择搭建自己的网上独立商城。网上独立商城是指一种完全独立于第三方平台的电子商务网站&#xff0c;可以帮助企业拥有更多的自主权&#xff0c;提高品牌影响力&#xff0c;降低营销成本&#xff0c;并且可以拥有更多的数据分析和…

java爬虫如何使用代理

在Java程序中使用代理是爬取网站数据的常见技术之一。代理服务器允许你通过它来访问某个网站&#xff0c;从而让你可以隐藏自己的真实IP地址或者规避一些地理限制等问题。 本文章将介绍如何使用Java实现网络爬虫代理。我们首先将介绍Java提供的代理相关类和方法&#xff0c;然…

详解C++类对象(中篇)——超详细

目录 前言&#xff1a;类的6个默认成员函数 一&#xff0c; 构造函数 1. 概念 2. 特性 二&#xff0c; 析构函数 2.1 概念 2.2 特性 2.3 牛刀小试 三&#xff0c; 拷贝构造函数 3.1概念 3. 2 特点 四&#xff0c; 赋值运算符重载 4. 1 运算符重载 五&#xff0…

【Redis高级应用】最佳实践

文章目录 Redis键值设计优雅的key结构拒绝BigKeyBigKey的危害如何发现BigKey如何删除BigKey 恰当的数据类型总结 批处理优化Pipeline我们的客户端与redis服务器是这样交互的MSetPipeline 集群下的批处理串行化执行代码实践 服务器端优化-持久化配置服务器端优化-慢查询优化什么…

Maven构建学习

目录 nacos是用来干什么的 Maven构建生命周期 Clean 生命周期 nacos是用来干什么的 在 Maven 项目中&#xff0c;pom.xml 文件中包含了项目的基本信息&#xff0c;通常包括&#xff1a; 能分别解释一下这里的 、、 maven-antrun-plugin分别起什么作用吗&#xff1f; rocke…

是德MSOX4104A 数字存储示波器

4000 X 系列拥有一系列引以为傲的配置&#xff0c;包括采用了电容触摸屏技术的 12.1 英寸显示屏、InfiniiScan 区域触摸触发、100 万波形/秒捕获率、MegaZoom IV 智能存储器技术和标配分段存储器。 MSOX4104A数字存储示波器 主要特性与技术指标 体验超凡速度&#xff1a; •1…

MQTT服务器搭建流程-QT开发客户端

目录 一、环境准备 二、客户端开发 2.1 下载并且编译MQTT 2.2 客户端开发准备 2.3 客户端开发源码 三、测试演示 一、环境准备 操作系统&#xff1a;centos7.5 链接: https://pan.baidu.com/s/1BRYQ13RTIgkyD0GDsXB1jQ 提取码: 29e2 MQTT服务器 使用EMQX作为服务器 安…

SpringCloud Alibaba 服务注册

一、SpringCloud Alibaba简介 Spring官网&#xff1a;https://spring.io/projects/spring-cloud-alibabaGitHub&#xff1a;https://github.com/alibaba/spring-cloud-alibabaGitHub中文文档&#xff1a;https://github.com/alibaba/spring-cloud-alibaba/blob/master/README-…

AFG1062任意波形/函数发生器 产品资料

AFG1000 任意波形/函数发生器&#xff0c;提供 25MHz 或 60MHz 带宽&#xff0c;2 个输出通道&#xff0c;在整个带宽内 1mVpp 到 10Vpp 输出振幅&#xff0c;泰克 AFG1000 任意波形/函数发生器可以生成各种实验室测试所需波形。 *重要的是&#xff0c;它在泰克任意函数发生器系…