1.PGP加密

1.1 简介

PGP:Pretty Good Policy,良好隐私密码法,是一套用于消息加密、验证的应用程序。

加密发送一个文件:

  • 获取pgp公钥进行加密文件内容,发送给指定用户。
  • 用户获取文件之后,用对应密钥对文件内容进行解密,获取数据。

1.2 生成pgp公钥密钥

下载软件的地址:https://files.gpg4win.org/gpg4win-3.1.11.exe

软件名:kleopatra

  • 新建密钥对

在这里插入图片描述

输入自定义的名称和邮件地址:

在这里插入图片描述
点击下一步:

在这里插入图片描述

箭头处输入用于保护密钥的密码,用于在使用密钥进行解密文件时的验证处理。

输入密码,点击ok。密码如果不合乎规定,可能会需要再次确定输入密码,如果符合要求,则不会弹出下面的弹框。

创建成功如下图:
在这里插入图片描述

生成密钥对副本:会导出对应的密钥文件:

-----BEGIN PGP PRIVATE KEY BLOCK-----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
=r3oi
-----END PGP PRIVATE KEY BLOCK-----

点击完成。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ygWv0Rxf-1594602528723)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373037620.png)]

点击对应表用户名。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IYfn8mJt-1594602528724)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373279784.png)]

点击导出,可以得到pgp的公钥文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VphuwNXS-1594602528725)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373917107.png)]

复制内容,创建文件,以pgp结尾保存即可。

1.3 对公钥加密的文件进行解密

打开软件kelopatra:点击“解密/校验”

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qkDcKk4o-1594602528725)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373470264.png)]

选择需要解密的文件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7jh60nlz-1594602528727)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373554945.png)]

输入之前设置的密钥保护密码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QW4bqTgj-1594602528727)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373610140.png)]

选择导出位置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ECuLh5wg-1594602528728)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373636271.png)]

可以在指定位置得到解密的文件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-41EfGcRZ-1594602528730)(C:\Users\hewb\AppData\Roaming\Typora\typora-user-images\1594373861926.png)]

1.4 pgp加密的运用

BouncyCastle是一个提供哈希算法和加密算法的第三方库,提供java标准库中没有的算法。

BouncyCastle中的第三方库提供了pgp加密的算法,可以设置参数直接进行调用。

BouncyCastle是一个提供哈希算法和加密算法的第三方库,提供java标准库中没有的算法。

java标准库提供一种标准机制:java.security,允许第三方提供商无缝接入。

 	//获取pgp公钥对象// in指的是公钥对应的输入文件流private PGPPublicKey readPublicKey(InputStream in) throws IOException, PGPException {//对输入文件六进行解码解析in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);//创建公钥环集合对象PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);PGPPublicKey key = null;//获取公钥环集合中的公钥环,公钥环对象有两个:主密钥和子密钥,需要使用的是子密钥。Iterator<PGPPublicKeyRing> rIt = pgpPub.getKeyRings();while (key == null && rIt.hasNext()) {PGPPublicKeyRing kRing = rIt.next();//从公钥环中获取公钥Iterator<PGPPublicKey> kIt = kRing.getPublicKeys();while (key == null && kIt.hasNext()) {PGPPublicKey k = kIt.next();//判断密钥是否适合于用于加密if (k.isEncryptionKey()) {key = k;}}}if (key == null) {throw new IllegalArgumentException("Can't find encryption key in key ring.");}return key;}//加密文件/** out指的时输出文件流* */private void encryptFile(OutputStream out, String fileName, PGPPublicKey encKey, boolean armor, boolean withIntegrityCheck) throws IOException, NoSuchProviderException, PGPException {//注册地三方库:BouncyCastleSecurity.addProvider(new BouncyCastleProvider());if (armor) {out = new ArmoredOutputStream(out);}ByteArrayOutputStream bOut = new ByteArrayOutputStream();//构造数据发生器PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);//以文字数据包的形式写出所提供的文件org.bouncycastle.openpgp.PGPUtil.writeFileToLiteralData(comData.open(bOut), PGPLiteralData.BINARY, new File(fileName));//关闭构造器comData.close();//构造新的数据加密构建器:指定的密码类型JcePGPDataEncryptorBuilder c = new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(new SecureRandom()).setProvider("BC");//实际加密对象PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(c);//使用提供的密钥创建加密方法JcePublicKeyKeyEncryptionMethodGenerator d = new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider(new BouncyCastleProvider()).setSecureRandom(new SecureRandom());//实际加密对象设置加密方法cPk.addMethod(d);byte[] bytes = bOut.toByteArray();OutputStream cOut = cPk.open(out, bytes.length);cOut.write(bytes);cOut.close();out.close();}

关键步骤:

  • 设置使用的第三方库
  • 构造数据发生器,定义文件的导出形式,例如文字数据包的形式。
  • 构造新的数据加密构造器:包括指定的密码类型
  • 使用构造发生器创建实际的加密对象
  • 创建加密方法:指定加密密钥,指定的三方库等
  • 加密对象指定加密方法
  • 使用加密对象进行加密

完整的代码示例:

package com.xx.util.encrypt;import java.io.*;
import java.security.GeneralSecurityException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Iterator;import org.bouncycastle.bcpg.ArmoredOutputStream;
import org.bouncycastle.bcpg.BCPGOutputStream;
import org.bouncycastle.bcpg.HashAlgorithmTags;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.PGPCompressedData;
import org.bouncycastle.openpgp.PGPCompressedDataGenerator;
import org.bouncycastle.openpgp.PGPEncryptedData;
import org.bouncycastle.openpgp.PGPEncryptedDataGenerator;
import org.bouncycastle.openpgp.PGPEncryptedDataList;
import org.bouncycastle.openpgp.PGPException;
import org.bouncycastle.openpgp.PGPLiteralData;
import org.bouncycastle.openpgp.PGPObjectFactory;
import org.bouncycastle.openpgp.PGPOnePassSignatureList;
import org.bouncycastle.openpgp.PGPPrivateKey;
import org.bouncycastle.openpgp.PGPPublicKey;
import org.bouncycastle.openpgp.PGPPublicKeyEncryptedData;
import org.bouncycastle.openpgp.PGPPublicKeyRing;
import org.bouncycastle.openpgp.PGPPublicKeyRingCollection;
import org.bouncycastle.openpgp.PGPSecretKey;
import org.bouncycastle.openpgp.PGPSecretKeyRing;
import org.bouncycastle.openpgp.PGPSecretKeyRingCollection;
import org.bouncycastle.openpgp.PGPSignature;
import org.bouncycastle.openpgp.PGPSignatureGenerator;
import org.bouncycastle.openpgp.PGPSignatureList;
import org.bouncycastle.openpgp.PGPUtil;
import org.bouncycastle.openpgp.operator.PBESecretKeyDecryptor;
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentSignerBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPContentVerifierBuilderProvider;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPDigestCalculatorProviderBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePBESecretKeyDecryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;public class PgpUtils {private static PgpUtils INSTANCE = null;public static PgpUtils getInstance() {if (INSTANCE == null) INSTANCE = new PgpUtils();return INSTANCE;}private PgpUtils() {}//获取pgp公钥对象// in指的是公钥对应的输入文件流private PGPPublicKey readPublicKey(InputStream in) throws IOException, PGPException {//对输入文件六进行解码解析in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);//创建公钥环集合对象PGPPublicKeyRingCollection pgpPub = new PGPPublicKeyRingCollection(in);PGPPublicKey key = null;//获取公钥环集合中的公钥环,公钥环对象有两个:主密钥和子密钥,需要使用的是子密钥。Iterator<PGPPublicKeyRing> rIt = pgpPub.getKeyRings();while (key == null && rIt.hasNext()) {PGPPublicKeyRing kRing = rIt.next();//从公钥环中获取公钥Iterator<PGPPublicKey> kIt = kRing.getPublicKeys();while (key == null && kIt.hasNext()) {PGPPublicKey k = kIt.next();//判断密钥是否适合于用于加密if (k.isEncryptionKey()) {key = k;}}}if (key == null) {throw new IllegalArgumentException("Can't find encryption key in key ring.");}return key;}//获取私钥对象private PGPPrivateKey findSecretKey(InputStream keyIn, long keyID, char[] pass) throws IOException, PGPException, NoSuchProviderException {//1.输入流文件中获取私钥环集合PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(org.bouncycastle.openpgp.PGPUtil.getDecoderStream(keyIn));//2.通过id获取私钥PGPSecretKey pgpSecKey = pgpSec.getSecretKey(keyID);if (pgpSecKey == null) {return null;}//设置解码器PBESecretKeyDecryptor a = new JcePBESecretKeyDecryptorBuilder(new JcaPGPDigestCalculatorProviderBuilder().setProvider("BC").build()).setProvider("BC").build(pass);//从pgpSeckey对象中通过定义的解码器进行提取pgp私钥return pgpSecKey.extractPrivateKey(a);}/*** 文件解码* decrypt the passed in message stream*/private void decryptFile(InputStream in, OutputStream out, InputStream keyIn, char[] passwd) throws Exception {//加载第三方库Security.addProvider(new BouncyCastleProvider());//获取in = org.bouncycastle.openpgp.PGPUtil.getDecoderStream(in);PGPObjectFactory pgpF = new PGPObjectFactory(in);PGPEncryptedDataList enc;Object o = pgpF.nextObject();//// the first object might be a PGP marker packet.//if (o instanceof PGPEncryptedDataList) {enc = (PGPEncryptedDataList) o;} else {enc = (PGPEncryptedDataList) pgpF.nextObject();}//// find the secret key//Iterator<PGPPublicKeyEncryptedData> it = enc.getEncryptedDataObjects();PGPPrivateKey sKey = null;PGPPublicKeyEncryptedData pbe = null;while (sKey == null && it.hasNext()) {pbe = it.next();sKey = findSecretKey(keyIn, pbe.getKeyID(), passwd);}if (sKey == null) {throw new IllegalArgumentException("Secret key for message not found.");}PublicKeyDataDecryptorFactory b = new JcePublicKeyDataDecryptorFactoryBuilder().setProvider("BC").setContentProvider("BC").build(sKey);InputStream clear = pbe.getDataStream(b);PGPObjectFactory plainFact = new PGPObjectFactory(clear);Object message = plainFact.nextObject();if (message instanceof PGPCompressedData) {PGPCompressedData cData = (PGPCompressedData) message;PGPObjectFactory pgpFact = new PGPObjectFactory(cData.getDataStream());message = pgpFact.nextObject();}if (message instanceof PGPLiteralData) {PGPLiteralData ld = (PGPLiteralData) message;InputStream unc = ld.getInputStream();int ch;while ((ch = unc.read()) >= 0) {out.write(ch);}} else if (message instanceof PGPOnePassSignatureList) {throw new PGPException("Encrypted message contains a signed message - not literal data.");} else {throw new PGPException("Message is not a simple encrypted file - type unknown.");}if (pbe.isIntegrityProtected()) {if (!pbe.verify()) {throw new PGPException("Message failed integrity check");}}}//加密文件/** out指的时输出文件流* */private void encryptFile(OutputStream out, String fileName, PGPPublicKey encKey, boolean armor, boolean withIntegrityCheck) throws IOException, NoSuchProviderException, PGPException {//注册地三方库:BouncyCastleSecurity.addProvider(new BouncyCastleProvider());if (armor) {out = new ArmoredOutputStream(out);}//输出文件流ByteArrayOutputStream bOut = new ByteArrayOutputStream();//构造数据发生器PGPCompressedDataGenerator comData = new PGPCompressedDataGenerator(PGPCompressedData.ZIP);//设置以文件数据包的形式写出数据org.bouncycastle.openpgp.PGPUtil.writeFileToLiteralData(comData.open(bOut), PGPLiteralData.BINARY, new File(fileName));comData.close();JcePGPDataEncryptorBuilder c = new JcePGPDataEncryptorBuilder(PGPEncryptedData.CAST5).setWithIntegrityPacket(withIntegrityCheck).setSecureRandom(new SecureRandom()).setProvider("BC");//实际及逆行加密对象PGPEncryptedDataGenerator cPk = new PGPEncryptedDataGenerator(c);//设置加密的公钥,使用的第三方库的加密方法JcePublicKeyKeyEncryptionMethodGenerator d = new JcePublicKeyKeyEncryptionMethodGenerator(encKey).setProvider(new BouncyCastleProvider()).setSecureRandom(new SecureRandom());//加密对象与加密方法关联cPk.addMethod(d);byte[] bytes = bOut.toByteArray();OutputStream cOut = cPk.open(out, bytes.length);cOut.write(bytes);cOut.close();out.close();}private byte[] inputStreamToByteArray(InputStream is) throws IOException {ByteArrayOutputStream buffer = new ByteArrayOutputStream();int nRead;byte[] data = new byte[1024];while ((nRead = is.read(data, 0, data.length)) != -1) {buffer.write(data, 0, nRead);}buffer.flush();return buffer.toByteArray();}/*** verify the signature in in against the file fileName.*/private boolean verifySignature(String fileName, byte[] b, InputStream keyIn) throws GeneralSecurityException, IOException, PGPException {//in = PGPUtil.getDecoderStream(in);PGPObjectFactory pgpFact = new PGPObjectFactory(b);PGPSignatureList p3 = null;Object o = pgpFact.nextObject();if (o instanceof PGPCompressedData) {PGPCompressedData c1 = (PGPCompressedData) o;pgpFact = new PGPObjectFactory(c1.getDataStream());p3 = (PGPSignatureList) pgpFact.nextObject();} else {p3 = (PGPSignatureList) o;}PGPPublicKeyRingCollection pgpPubRingCollection = new PGPPublicKeyRingCollection(PGPUtil.getDecoderStream(keyIn));InputStream dIn = new BufferedInputStream(new FileInputStream(fileName));PGPSignature sig = p3.get(0);PGPPublicKey key = pgpPubRingCollection.getPublicKey(sig.getKeyID());sig.init(new JcaPGPContentVerifierBuilderProvider().setProvider(new BouncyCastleProvider()), key);int ch;while ((ch = dIn.read()) >= 0) {sig.update((byte) ch);}dIn.close();if (sig.verify()) {return true;} else {return false;}}private PGPSecretKey readSecretKey(InputStream input) throws IOException, PGPException {PGPSecretKeyRingCollection pgpSec = new PGPSecretKeyRingCollection(PGPUtil.getDecoderStream(input));//// we just loop through the collection till we find a key suitable for encryption, in the real// world you would probably want to be a bit smarter about this.//Iterator keyRingIter = pgpSec.getKeyRings();while (keyRingIter.hasNext()) {PGPSecretKeyRing keyRing = (PGPSecretKeyRing) keyRingIter.next();Iterator keyIter = keyRing.getSecretKeys();while (keyIter.hasNext()) {PGPSecretKey key = (PGPSecretKey) keyIter.next();if (key.isSigningKey()) {return key;}}}throw new IllegalArgumentException("Can't find signing key in key ring.");}private byte[] createSignature(String fileName, InputStream keyIn, char[] pass, boolean armor) throws GeneralSecurityException, IOException, PGPException {PGPSecretKey pgpSecKey = readSecretKey(keyIn);PGPPrivateKey pgpPrivKey = pgpSecKey.extractPrivateKey(new JcePBESecretKeyDecryptorBuilder().setProvider(new BouncyCastleProvider()).build(pass));PGPSignatureGenerator sGen = new PGPSignatureGenerator(new JcaPGPContentSignerBuilder(pgpSecKey.getPublicKey().getAlgorithm(), HashAlgorithmTags.SHA1).setProvider(new BouncyCastleProvider()));sGen.init(PGPSignature.BINARY_DOCUMENT, pgpPrivKey);ByteArrayOutputStream byteOut = new ByteArrayOutputStream();ArmoredOutputStream aOut = new ArmoredOutputStream(byteOut);BCPGOutputStream bOut = new BCPGOutputStream(byteOut);InputStream fIn = new BufferedInputStream(new FileInputStream(fileName));int ch;while ((ch = fIn.read()) >= 0) {sGen.update((byte) ch);}aOut.endClearText();fIn.close();sGen.generate().encode(bOut);if (armor) {aOut.close();}return byteOut.toByteArray();}/*** 生成签名文件** @param filePath         签名文件路径* @param privateKeyPath   私钥路径* @param outFilePath      输出证书路径*                         证书名称必须与签名文件名称一样 多后缀: .asc*                         比如: 签名文件为:di.ova   那么生成的证书必须为: di.ova.asc* @param passWord         证书密码* @return 证书字节数组*/public static byte[] signatureCreate(String filePath, String privateKeyPath, String outFilePath, String passWord) {try {FileInputStream privKeyIn = new FileInputStream(privateKeyPath);FileOutputStream signatureOut = new FileOutputStream(outFilePath);byte[] sig = PgpUtils.getInstance().createSignature(filePath, privKeyIn, passWord.toCharArray(), true);signatureOut.write(sig);signatureOut.flush();signatureOut.close();privKeyIn.close();return sig;} catch (Exception e) {e.printStackTrace();return null;}}/*** 签名验证** @param filePath        被签名的文件路径* @param publicKeyPath   公钥路径* @param signFilePath    签名文件路径* @return 是否通过*/public static boolean verifySignature(String filePath, String publicKeyPath, String signFilePath) {try {FileInputStream pubKeyIs = new FileInputStream(publicKeyPath);FileInputStream signFile = new FileInputStream(signFilePath);byte[] signFileBytes = new byte[signFile.available()];signFile.read(signFileBytes);final boolean verifyResult = PgpUtils.getInstance().verifySignature(filePath, signFileBytes, pubKeyIs);signFile.close();pubKeyIs.close();return verifyResult;} catch (Exception e) {e.printStackTrace();return false;}}}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 昨天我又无效社交了

    不知道有多少人跟我一样,觉得社交——跟别人沟通和交流——是一件很有趣的事情。 因此在过去的几年里,我花了大量时间在社交这件事情上。最近半年我在反思,我为什么要去社交?为什么我需要花费这么多时间去社交?我有多少时间的社交是有价值的? 每个人心中都有一把尺子,这…...

    2024/4/28 23:39:10
  2. Java实训Six

    2020.07.11第六次java实训 这次实训我们要开始做窗口界面了,这个要比之前只要代码看起来要好玩一点了。 首先我们要创建应用程序类1、创建主界面窗口MainFrame 运行结构如下:2、创建用户登录窗口LoginFrame 运行结果如下:3、创建用户注册窗口RegisterFrame package net.czy.s…...

    2024/4/18 3:24:33
  3. deeplabv3+复现

    deeplabv3+复现实验 1. 数据集 1.1 下载整理 参考:https://blog.csdn.net/github_36923418/article/details/81453519 deeplabv3+中说明,文章使用的数据集是VOC2012,并通过SBD的方法进行了数据增强 VOC2012数据集包括4大类,20小类,算背景共21类,文件结构如下:Annotations…...

    2024/4/14 13:01:37
  4. 剑指Offer05替换字符串中的空格Java题解

    代码 class Solution {public String replaceSpace(String s) {StringBuffer res=new StringBuffer();for(Character c:s.toCharArray()){if(c== ) res.append("%20");else res.append(c);}return res.toString();} }复杂度 时间O(n) 空间O(n) java学习 1.StringBuff…...

    2024/4/20 2:22:01
  5. 看动画学算法之:排序-插入排序

    文章目录简介插入排序的例子插入排序的java程序插入排序的时间复杂度 简介 插入排序就是将要排序的元素插入到已经排序的数组中,从而形成一个新的排好序的数组。 这个算法就叫做插入排序。 插入排序的例子 同样的,假如我们有一个数组:29,10,14,37,20,25,44,15,怎么对它进行…...

    2024/4/14 13:00:21
  6. 在IE浏览器中,使用Adobe Acrobat Reader dc插件来在线加载PDF,PDF会出现在最前端,并挡住其它需要弹出的窗口

    问题描述 在IE11环境下,使用Adobe Acrobat Reader dc插件来在线加载PDF,PDF加载在一个iframe页面中,此时PDF所在的iframe会有很高的优先级,在原父页面上的其他弹出窗口都被PDF遮挡覆盖。 解决方案 有以下三种解决方案 1.如果需要的弹窗很小,而且PDF所在的iframe不是全屏,…...

    2024/4/14 13:00:26
  7. Java 应用线上问题排查思路、常用工具小结

    前言本文总结了一些常见的线上应急现象和对应排查步骤和工具。分享的主要目的是想让对线上问题接触少的同学有个预先认知,免得在遇到实际问题时手忙脚乱。毕竟作者自己也是从手忙脚乱时走过来的。只不过这里先提示一下。在线上应急过程中要记住,只有一个总体目标:尽快恢复服…...

    2024/4/14 20:32:49
  8. RedisTemplate使用lua脚本实现Redis分布式锁

    RedisTemplate使用lua脚本实现Redis分布式锁 package com.jslc.analysis.utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.script.RedisScrip…...

    2024/4/20 4:54:38
  9. mongodb 分片集群搭建

    (1)如图搭建一个分片集群 要求每个分片节点中的复制集含有一个仲裁节点 (2)使用权限控制 建立访问你访问的数据库lg_resume 这个账号名字是lagou_gx 密码是abc321 这个账号对数据库有读写权限 (3)使用SpringBoot 进行访问分片集群 对lg_resume 库中的lg_resume_datas 进行增加数…...

    2024/4/17 21:17:22
  10. 浅谈Ubuntu18.04安装deepin wine软件的一些问题

    聊天工具在日常中所占的份量显然不轻,哪怕是换了操作系统也还是多少会用到 不要和我杠说什么linux玩什么qq微信,你怎么不去老老实实windows。 不要和我杠说什么linux玩什么qq微信,你怎么不去老老实实windows。 不要和我杠说什么linux玩什么qq微信,你怎么不去老老实实window…...

    2024/4/14 13:00:16
  11. TLK7-EVM开发例程使用手册(1)

    Draft DateRevision No.Description2018/8/16V1.31.添加DDR3-DDR3的读写测试高配例程2018/7/10V1.21.添加UDP-SFP-UDP网络通信功能测试。2.修改USB例程描述。2018/5/15V1.11.勘误。2017/11/24V1.01.初始版本。目 录1 基于下载器的程序加载与烧写 31.1 程序加载 31.2 程序烧写…...

    2024/4/14 13:00:11
  12. 使用静态库编译出应用程序,使用该静态库编译出的动态库生成该应用程序依赖的动态库之后导致崩溃

    看了这个标题肯定感觉很绕~!图示如下:这种问题有助于学习编译中的一些细节吧! 个人猜测:如果都是使用静态库的话,静态库的依赖有可能进行了特殊处理,a.out和b.so的代码位置显示一直,使用的是objdump -t查看的函数调用。如果都是使用动态库的话,a.out和b,so也是引用相同…...

    2024/4/14 13:00:26
  13. ASP.NET Core端点路由 作用原理

    端点路由(Endpoint Routing)最早出现在http://ASP.NET Core2.2,在http://ASP.NET Core3.0提升为一等公民。Endpoint Routing的动机在端点路由出现之前,我们一般在请求处理管道的末尾,定义MVC中间件解析路由。这种方式意味着在处理管道中,MVC中间件之前的中间件将无法获得路…...

    2024/4/19 23:26:47
  14. 一般处理程序接收json , ashx 接收 json

    分两种情况 1json字符串 前端代码var data = {SignatureStr: "5kESq0Dly1T/tngzmmaMQA==",}$.ajax({url: "XXX.ashx?action=regist",data: JSON.stringify(data),//"{"SignatureStr":"5kESq0Dly1T/tngzmmaMQA=="}"contentT…...

    2024/4/17 23:55:18
  15. 旋转链表

    给定一个链表,旋转链表,将链表每个节点向右移动 k 个位置,其中 k 是非负数。 示例 1: 输入: 1->2->3->4->5->NULL, k = 2 输出: 4->5->1->2->3->NULL 解释: 向右旋转 1 步: 5->1->2->3->4->NULL 向右旋转 2 步: 4->5->1…...

    2024/4/14 13:01:37
  16. 常用liuns命令

    cd … 返回上一级目录 cd …/… 返回上两级目录 cd或cd ~ 返回home目录 cd - 目录名 返回指定目录...

    2024/4/14 13:01:02
  17. c#为什么字典容量是素数?

    涉及字典的内bai部实现方法。 字典在内部是通过hash表来实现查du找zhi的,而查找树在数据结构上采用了有序二叉树与“dao哈希桶”的一种数据结构来管理元素。 在每个哈希桶里,为了能快速找到一个元素是否存在于此桶,需要为每一个元素进行哈希编码,哈希编码常常采用除余法,也…...

    2024/4/14 13:00:41
  18. JavaScript中的Map、WeakMap、Set和WeakSet介绍【云图智联】

    免费学习视频欢迎关注云图智联:https://e.yuntuzhilian.com/我猜想,超过70%的JavaScript开发人员仅使用对象来收集和维护其项目中的数据。好吧,确实如此,新的集合对象(例如Map和Set)即使在2015年问世也没有得到充分利用。因此,今天,我将讨论2015年以来的神奇新功能——Ma…...

    2024/4/18 5:48:38
  19. 微信小程序开发之『弹出菜单』特效(转)

    先看下效果图.:1.popMenu.js Page({data: {isPopping: false,//是否已经弹出animPlus: {},//旋转动画animCollect: {},//item位移,透明度animTranspond: {},//item位移,透明度animInput: {},//item位移,透明度},//点击弹出plus: function () {if (this.data.isPopping) {//缩回…...

    2024/4/19 15:41:34
  20. keras-入门-05-卷积神经网络

    卷积神经网络的模型 主函数 # 导入所需工具包 import matplotlib from model_name.simple_vggnet import SimpleVGGNet from sklearn.preprocessing import LabelBinarizer from sklearn.model_selection import train_test_split from sklearn.metrics import classification_…...

    2024/4/14 13:00:36

最新文章

  1. Java在物联网和嵌入式系统中的应用

    Java在物联网和嵌入式系统中的应用 一、引言 随着信息技术的快速发展&#xff0c;物联网和嵌入式系统已经成为当今社会的热点领域。它们为我们的生活带来了前所未有的便利和智能化。而Java作为一种功能强大、跨平台的编程语言&#xff0c;在物联网和嵌入式系统中的应用也日渐…...

    2024/4/28 23:39:58
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 推荐一个好用的数据库映射架构

    SqlSugar ORM 优点: SqlSugar 是 .NET 开源 ORM 框架,由 Fructose 大数据技术团队维护和更新,是开箱即用最易用的 ORM 优点: 【低代码】【高性能】【超简单】【功能综合】【多数据库兼容】【适用产品】 支持 .NET .NET framework.net core3.1.ne5.net6.net7.net8 .net…...

    2024/4/27 4:18:36
  4. Unity核心学习

    目录 认识模型的制作流程模型的制作过程 2D相关图片导入设置图片导入概述纹理类型设置纹理形状设置纹理高级设置纹理平铺拉伸设置纹理平台打包相关设置 SpriteSprite Editor——Single图片编辑Sprite Editor——Multiple图片编辑Sprite Editor——Polygon图片编辑SpriteRendere…...

    2024/4/24 7:49:17
  5. 策略模式图

    策略模式 小小的图解 主要的三个角色 Strategy—抽象策略角色ConcreateStrategy—具体策略角色Context—上下文角色 封装了对具体策略的调用可以使用set的依赖注入也可以使用构造方法 核心是上下文角色 只要调用上下文角色就行&#xff0c;实现解耦 策略 工厂 将上下文角…...

    2024/4/28 11:28:58
  6. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/4/28 13:52:11
  7. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/4/28 3:28:32
  8. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/26 23:05:52
  9. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/4/28 13:51:37
  10. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  11. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  12. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  13. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/28 15:57:13
  14. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  15. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/4/25 18:39:16
  16. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  17. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  18. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/28 1:22:35
  19. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/25 18:39:14
  20. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/4/26 23:04:58
  21. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  22. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  23. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/26 19:46:12
  24. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/4/27 11:43:08
  25. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/27 8:32:30
  26. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  27. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  28. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  29. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  30. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  31. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  32. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  33. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  34. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  35. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  36. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  37. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  38. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  39. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  40. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  41. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  42. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  43. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  44. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  45. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57