SpringBoot生成和解析二维码完整工具类分享(提供Gitee源码)

news2024/12/23 17:26:28

前言:在日常的开发工作当中可能需要实现一个二维码小功能,我参考了网上很多关于SpringBoot生成二维码的教程,最终还是自己封装了一套完整生成二维码的工具类,可以支持基础的黑白二维码、带颜色的二维码、带Logo的二维码、带颜色和Logo的二维码和解析二维码五大功能,还可以生成具体的二维码文件或返回Base64,都是博主自己手写封装好的,这边免费开源给大家一键使用!只求大家一个免费的三连支持!

目录

一、问题记录

二、导入pom依赖

三、QRCodeUtil工具类完整代码

四、使用示例

五、Gitee源码

六、总结


一、问题记录

这边我使用的是zxing提供的jar包生成的二维码,不过有1个问题博客目前暂时未解决,如果有解决的方法希望可以在评论区交流一下,问题如下:

二维码的内容如果设置为中文,会报com.google.zxing.NotFoundException的错误,这个问题博主搜索了网上很多的信息也没有找到具体的解决方案。

二、导入pom依赖

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 二维码生成器依赖 -->
        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>core</artifactId>
            <version>3.3.0</version>
        </dependency>

        <dependency>
            <groupId>com.google.zxing</groupId>
            <artifactId>javase</artifactId>
            <version>3.3.0</version>
        </dependency>

        <!-- 常用工具类 -->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        
    </dependencies>

三、QRCodeUtil工具类完整代码

package com.example.ewm.utils;

import java.awt.BasicStroke;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Shape;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Hashtable;
import java.util.Random;
import javax.imageio.ImageIO;

import com.google.zxing.*;
import com.google.zxing.client.j2se.BufferedImageLuminanceSource;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.common.HybridBinarizer;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Component;

/**
 * @author HTT
 */
@Component
public class QRCodeUtil {
    /**
     * 编码格式
     */
    private static final String CHARSET = "utf-8";

    /**
     * 二维码后缀名
     */
    private static final String FORMAT_NAME = "JPG";

    /**
     * 二维码尺寸
     */
    private static final int QRCODE_SIZE = 300;

    /**
     * 插入图宽度
     */
    private static final int WIDTH = 60;

    /**
     * 插入图高度
     */
    private static final int HEIGHT = 60;

    /**
     * 插入图片
     * @param source 文件流
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @throws Exception
     */
    private void insertImage(BufferedImage source, String imgPath, boolean needCompress) throws Exception {
        File file = new File(imgPath);
        if (!file.exists()) {
            throw new Exception(imgPath+"图片文件不存在");
        }
        Image src = ImageIO.read(new File(imgPath));
        int width = src.getWidth(null);
        int height = src.getHeight(null);
        // 压缩LOGO
        if (needCompress) {
            if (width > WIDTH) {
                width = WIDTH;
            }
            if (height > HEIGHT) {
                height = HEIGHT;
            }
            Image image = src.getScaledInstance(width, height, Image.SCALE_SMOOTH);
            BufferedImage tag = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
            Graphics g = tag.getGraphics();
            // 绘制缩小后的图
            g.drawImage(image, 0, 0, null);
            g.dispose();
            src = image;
        }
        // 插入LOGO
        Graphics2D graph = source.createGraphics();
        int x = (QRCODE_SIZE - width) / 2;
        int y = (QRCODE_SIZE - height) / 2;
        graph.drawImage(src, x, y, width, height, null);
        Shape shape = new RoundRectangle2D.Float(x, y, width, width, 6, 6);
        graph.setStroke(new BasicStroke(3f));
        graph.draw(shape);
        graph.dispose();
    }

    /**
     * 创建带图片的二维码核心方法(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @return
     * @throws Exception
     */
    private BufferedImage createEwm(String content, String imgPath, boolean needCompress) throws Exception {
        Hashtable hints = new Hashtable(16);
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
                hints);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? 0xFF000000 : 0xFFFFFFFF);
            }
        }
        if (StringUtils.isEmpty(imgPath)) {
            return image;
        }
        // 插入图片
        insertImage(image, imgPath, needCompress);
        return image;
    }

    /**
     * 创建自定义颜色和图片的二维码核心方法(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @param frontColor 前景色
     * @param backgroundColor 背景色
     * @return
     * @throws Exception
     */
    private BufferedImage createEwm(String content, String imgPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {
        Hashtable hints = new Hashtable(16);
        hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
        hints.put(EncodeHintType.CHARACTER_SET, CHARSET);
        hints.put(EncodeHintType.MARGIN, 1);
        BitMatrix bitMatrix = new MultiFormatWriter().encode(content, BarcodeFormat.QR_CODE, QRCODE_SIZE, QRCODE_SIZE,
                hints);
        int width = bitMatrix.getWidth();
        int height = bitMatrix.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        for (int x = 0; x < width; x++) {
            for (int y = 0; y < height; y++) {
                image.setRGB(x, y, bitMatrix.get(x, y) ? frontColor : backgroundColor);
            }
        }
        if (StringUtils.isEmpty(imgPath)) {
            return image;
        }
        // 插入图片
        insertImage(image, imgPath, needCompress);
        return image;
    }

    /**
     * 生成带图片的二维码保存为文件(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param destPath 存放路径
     * @param needCompress 是否压缩图片
     * @throws Exception
     */
    private void generate(String content, String imgPath, String destPath, boolean needCompress) throws Exception {
        BufferedImage image = createEwm(content, imgPath, needCompress);
        mkdirs(destPath);
        ImageIO.write(image, FORMAT_NAME, new File(destPath));
    }

    /**
     * 创建自定义颜色和图片的二维码保存为文件(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径(路径为空,则只生成基础的二维码)
     * @param destPath 存放路径
     * @param needCompress 是否压缩图片
     * @param frontColor 前景色
     * @param backgroundColor 背景色
     * 例举一些16进制的颜色代码
     * 0x000000 黑
     * 0xff0000 亮红
     * 0x00ff00 亮绿
     * 0xffff00 亮黄
     * 0x0000ff 亮蓝
     * 0xff00ff 亮紫
     * 0x00ffff 亮浅蓝
     * 0xffffff 白
     * 0xc6c6c6 亮灰
     * 0x848484 暗灰
     * @throws Exception
     */
    private void generate(String content, String imgPath, String destPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {
        BufferedImage image = createEwm(content, imgPath, needCompress,frontColor,backgroundColor);
        mkdirs(destPath);
        ImageIO.write(image, FORMAT_NAME, new File(destPath));
    }

    /**
     * 生成带有图片的二维码并返回Base64(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @return
     * @throws Exception
     */
    private String generateBase64(String content, String imgPath, boolean needCompress) throws Exception {
        if (!StringUtils.isEmpty(content)) {
            HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN, 0);
            BufferedImage bufferedImage = createEwm(content, imgPath, needCompress);
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, FORMAT_NAME, os);
            String base64 = Base64.encode(os.toByteArray());
            os.flush();
            os.close();
            return "data:image/png;base64," + base64;
        }
        return "";
    }

    /**
     * 生成带有自定义颜色和图片的二维码并返回Base64(如果图片路径为空,不会生成图片)
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @param frontColor 前景色
     * @param backgroundColor 背景色
     * @return
     * @throws Exception
     */
    private String generateBase64(String content, String imgPath, boolean needCompress,int frontColor,int backgroundColor) throws Exception {
        if (!StringUtils.isEmpty(content)) {
            HashMap<EncodeHintType, Comparable> hints = new HashMap<>();
            hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
            hints.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);
            hints.put(EncodeHintType.MARGIN, 0);
            BufferedImage bufferedImage = createEwm(content, imgPath, needCompress,frontColor,backgroundColor);
            ByteArrayOutputStream os = new ByteArrayOutputStream();
            ImageIO.write(bufferedImage, FORMAT_NAME, os);
            String base64 = Base64.encode(os.toByteArray());
            os.flush();
            os.close();
            return "data:image/png;base64," + base64;
        }
        return "";
    }

    /**
     * 创建多级目录
     * @param destPath
     */
    private void mkdirs(String destPath) {
        File file = new File(destPath);
        if (!file.exists() && !file.isDirectory()) {
            file.mkdirs();
        }
    }

    /**
     * 根据文件解析二维码
     * @param file
     * @return
     * @throws Exception
     */
    private String analysis(File file) throws Exception {
        BufferedImage image;
        image = ImageIO.read(file);
        if (image == null) {
            return null;
        }
        BufferedImageLuminanceSource source = new BufferedImageLuminanceSource(image);
        BinaryBitmap bitmap = new BinaryBitmap(new HybridBinarizer(source));
        HashMap hints = new HashMap<DecodeHintType, Object>();
        hints.put(DecodeHintType.CHARACTER_SET, CHARSET);
        Result result = new MultiFormatReader().decode(bitmap, hints);
        String resultStr = result.getText();
        return resultStr;
    }

    /*******************************************************以下是创建二维码提供的方法封装*******************************************************/

    /******************************另存为文件版本******************************/

    /**
     * 创建基础的二维码
     * @param content 二维码内容
     * @param destPath 存放路径
     * @throws Exception
     */
    public void create(String content, String destPath) throws Exception {
        generate(content, null, destPath, false);
    }

    /**
     * 创建带颜色基础的二维码
     * @param content 二维码内容
     * @param destPath 存放路径
     * @throws Exception
     */
    public void create(String content, String destPath,int frontColor,int backgroundColor) throws Exception {
        generate(content, null, destPath, false,frontColor,backgroundColor);
    }

    /**
     * 创建带图片的二维码
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param destPath 存放路径
     * @param needCompress 是否压缩图片
     * @throws Exception
     */
    public void create(String content, String imgPath, String destPath,boolean needCompress) throws Exception {
        generate(content, imgPath, destPath, needCompress);
    }

    /**
     * 创建带有自定义颜色和图片的二维码
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param destPath 存放路径
     * @param needCompress 是否压缩图片
     * @param frontColor 前景色
     * @param backgroundColor 背景色
     * @throws Exception
     */
    public void create(String content, String imgPath, String destPath,boolean needCompress,int frontColor,int backgroundColor) throws Exception {
        generate(content, imgPath, destPath, needCompress,frontColor,backgroundColor);
    }

    /******************************另存为文件版本******************************/

    /******************************Base64版本******************************/

    /**
     * 创建基础的二维码并返回Base64
     * @param content
     * @throws Exception
     */
    public String create(String content) throws Exception {
        return generateBase64(content,null,false);
    }

    /**
     * 创建带颜色基础的二维码并返回Base64
     * @param content
     * @throws Exception
     */
    public String create(String content,int frontColor,int backgroundColor) throws Exception {
        return generateBase64(content,null,false,frontColor,backgroundColor);
    }

    /**
     * 创建带图片的二维码并返回Base64
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @throws Exception
     */
    public String create(String content, String imgPath,boolean needCompress) throws Exception {
        return generateBase64(content, imgPath, needCompress);
    }

    /**
     * 创建带有自定义颜色和图片的二维码并返回Base64
     * @param content 二维码内容
     * @param imgPath 图片路径
     * @param needCompress 是否压缩图片
     * @param frontColor 前景色
     * @param backgroundColor 背景色
     * @throws Exception
     */
    public String create(String content, String imgPath,boolean needCompress,int frontColor,int backgroundColor) throws Exception {
        return generateBase64(content, imgPath, needCompress,frontColor,backgroundColor);
    }

    /******************************Base64版本******************************/

    /**
     * 根据文件路径解析二维码
     * @param path 文件路径
     * @return
     * @throws Exception
     */
    public String decode(String path) throws Exception {
        File file = new File(path);
        if(!file.exists()){
            throw new Exception("文件不存在!");
        }
        return analysis(file);
    }

}

四、使用示例

友情提醒:代码中的布尔值是代表Logo图片是否需要被压缩,如果是true说明嵌入的Logo图片需要被压缩,我的建议是默认为true,因为如果不压缩,在使用decode解析带Logo的二维码的时候会报com.google.zxing.NotFoundException的错误,博主亲自测试过。

单元测试:

@SpringBootTest
class EwmApplicationTests {

    @Resource
    private QRCodeUtil qrCodeUtil;

    @Test
    void contextLoads() throws Exception {

        qrCodeUtil.create("httstudy","F:\\基础二维码.jpg");
        qrCodeUtil.create("httstudy","F:\\带颜色的二维码.jpg",0xff0000,0xffff00);
        qrCodeUtil.create("httstudy","F:\\Logo.png","F:\\带logo的二维码.jpg",true);
        qrCodeUtil.create("httstudy","F:\\Logo.png","F:\\带颜色和logo的二维码.jpg",true,0xff0000,0xffff00);

        String str = qrCodeUtil.create("httstudy");
        String str2 = qrCodeUtil.create("httstudy",0xff0000,0xffff00);
        String str3 = qrCodeUtil.create("httstudy","F:\\Logo.png",true);
        String str4 = qrCodeUtil.create("httstudy","F:\\Logo.png",true,0xff0000,0xffff00);
        System.out.println(str);
        System.out.println(str2);
        System.out.println(str3);
        System.out.println(str4);

        String result = qrCodeUtil.decode("F:\\基础二维码.jpg");
        String result2 = qrCodeUtil.decode("F:\\带颜色的二维码.jpg");
        String result3 = qrCodeUtil.decode("F:\\带logo的二维码.jpg");
        String result4 = qrCodeUtil.decode("F:\\带颜色和logo的二维码.jpg");
        System.out.println(result);
        System.out.println(result2);
        System.out.println(result3);
        System.out.println(result4);
    }

}

 运行结果:

五、Gitee源码

码云地址:SpringBoot生成二维码完整工具类分享

六、总结

良心博主原创封装不易,把常见场景需要用到的二维码类型都给大家封装好了,只要像单元测试那样一键生成就好了,如有问题,欢迎评论区留言!

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

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

相关文章

【考研数学】线形代数第三章——向量 | 基本概念、向量组的相关性与线性表示

文章目录 引言一、向量的概念与运算1.1 基本概念1.2 向量运算的性质 二、向量组的相关性与线性表示2.1 理论背景2.2 相关性与线性表示基本概念2.3 向量组相关性与线性表示的性质 引言 向量是线性代数的重点和难点。向量是矩阵&#xff0c;同时矩阵又是由向量构成的&#xff0c…

从 0 到 1 读懂:哈希表

哈希表 一、什么是哈希表&#xff1f;二、两种散列函数构造方法1、直接定址法2、除留余数法&#xff08;常用&#xff09; 三、散列地址冲突四、常用冲突处理1、负载因子调节&#xff08;减少冲突概率&#xff09;2、开放定址法&#xff08;闭散列&#xff09;&#xff08;1&am…

【C++奇遇记】内存模型

&#x1f3ac; 博客主页&#xff1a;博主链接 &#x1f3a5; 本文由 M malloc 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;LeetCode刷题集 数据库专栏 初阶数据结构 &#x1f3c5; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; 如…

VB.NET通过VB6 ActiveX DLL调用PowerBasic及FreeBasic动态库

前面说的Delphi通过Activex DLL同时调用PowerBasic和FreeBasic写的DLL&#xff0c;是在WINDOWS基础平台上完成的。 而 .NET平台是架在WINDOWS基础平台之上的&#xff0c;它的上面VB.NET或C#等开发的APP程序&#xff0c;下面写一下用VB.NET&#xff0c;通过VB6注册的Activex DLL…

16.遍历二叉树,线索二叉树

目录 一. 遍历二叉树 &#xff08;1&#xff09;三种遍历方式 &#xff08;2&#xff09;递归遍历算法 &#xff08;3&#xff09;非递归遍历算法 &#xff08;4&#xff09;层次遍历算法 二. 基于递归遍历算法的二叉树有关算法 &#xff08;1&#xff09;二叉树的建立 …

小程序中的页面配置和网络数据请求

页面配置文件和常用的配置项 1.在msg.json中配置window中的颜色和背景色 "navigationBarBackgroundColor": "#efefef","navigationBarTextStyle": "black" 2.可以看到home中的没有发生变化但是msg的发生变化了&#xff0c;这个和前面的…

Mysql查询重复数据常用方法

在平常的开发工作中&#xff0c;我们经常需要查询数据&#xff0c;比如查询某个表中重复的数据&#xff0c;那么&#xff0c;具体应该怎么实现呢&#xff1f;常用的方法都有哪些呢&#xff1f; 测试表中数据&#xff1a; 1&#xff1a;查询名字重复的数据 having&#xff1a; …

面试之快速学习计算机网络-http

1. HTTP常见状态码 2. 3开头重定向&#xff0c;4开头客户端错误&#xff0c;5开头服务端错误 2. HTTP 报文 1. start-line&#xff1a;请求行&#xff0c;可以为以下两者之一&#xff1a; 请求行&#xff1a; GET /hello-world2.html HTTP/1.1状态行&#xff1a;HTTP/1.1 200…

关于模板的大致认识【C++】

文章目录 函数模板函数模板的原理函数模板的实例化模板参数的匹配原则 类模板类模板的定义格式类模板的实例化 非类型模板参数typename 与class模板的特化函数模板特化类模板特化全特化偏特化 模板的分离编译 函数模板 函数模板的原理 template <typename T> //模板参数…

el-input输入框 输入数字中文 来回切换之后 监听失效问题如何解决

实现一个vue自定义指令——输入框&#xff08;input,el-input&#xff09;输入内容类型限制&#xff0c;解决中文输入法双向绑定失效问题&#xff0c;多种类型支持&#xff0c;数字类型&#xff0c;浮点类型、英文类型、整数类型、四则运算等 直接上代码 首先新建input.js ex…

Git如何操作本地分支仓库?

基本使用TortoiseGit 操作本地仓库(分支) 分支的概念 几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来&#xff0c;避免影响开发主线。多线程开发,可以同时开启多个任务的开发&#xff0c;多个任务之间互不影响。 为何要…

10个好用的网络画图工具推荐,专业办公绘图必备!

在当今数字化时代&#xff0c;网络画图工具成为了各行各业的重要辅助工具。无论是制作流程图、思维导图、原型设计&#xff0c;还是插图绘制、数据可视化&#xff0c;网络画图工具为用户提供了便捷、高效的创作平台。本文将向大家推荐10个好用的网络画图工具&#xff0c;帮助你…

深度解析淘宝API商品评论接口的实现原理与使用方法

淘宝API商品评论接口&#xff0c;主要用于获取某个商品的评价信息。通过该接口&#xff0c;我们可以获取到商品的所有评价内容、评价时间、评价等级等相关信息&#xff0c;帮助我们更好地了解用户对商品的反馈&#xff0c;进而进行数据分析和业务优化。 一、接口鉴权 在使用淘…

波奇学C++:stl的list模拟实现

list是双向带头链表。所以迭代器end()相当于哨兵卫的头。 list不支持和[]重载&#xff0c;原因在于list空间不是连续的&#xff0c;和[]的代价比较大。 访问第n个节点&#xff0c;只能用for循环&#xff0c;来实现 list<int> l; l.push_back(0); l.push_back(1); l.pu…

代码随想录算法训练营之JAVA|第三十五天|343. 整数拆分

今天是第 天刷leetcode&#xff0c;立个flag&#xff0c;打卡60天&#xff0c;如果做不到&#xff0c;完成一件评论区点赞最高的挑战。 算法挑战链接 343. 整数拆分https://leetcode.cn/problems/integer-break/ 第一想法 题目理解&#xff1a;将一个整数拆分为k个整数&…

python matlab 画坐标图

画一个坐标系&#xff0c;同时显示两条直线&#xff0c;效果图如下&#xff1a; 功能点&#xff1a; 同时显示两个纵坐标数据 显示图片名称 图片最大化保存 到本地 在图片某个位置显示字符信息 不同的线名称提示 代码如下&#xff1a; import matplotlib.pyplot as pltde…

学习左耳听风栏目90天——第七天 7/90(学习左耳朵耗子的工匠精神,对技术的热爱)【每个程序员都该知道的事】

每个程序员都该知道的事 每个程序员都应该要读的书每个搞计算机专业的学生应有的知识LinkedIn 高效的代码复查技巧编程语言和代码质量的研究报告 每个程序员都应该要读的书 每个搞计算机专业的学生应有的知识 LinkedIn 高效的代码复查技巧 编程语言和代码质量的研究报告

C++头文件和std命名空间

C 是在C语言的基础上开发的&#xff0c;早期的 C 还不完善&#xff0c;不支持命名空间&#xff0c;没有自己的编译器&#xff0c;而是将 C 代码翻译成C代码&#xff0c;再通过C编译器完成编译。 这个时候的 C 仍然在使用C语言的库&#xff0c;stdio.h、stdlib.h、string.h 等头…

CentOS7网络配置

本文是我从另外三个文章中整合而来&#xff0c;用于自存&#xff0c;如有侵权请联系我删除。 CentOS 7教程&#xff08;二&#xff09;-网络设置 - 知乎 (zhihu.com) VMware安装、Linux下CentOS7的配置及网络环境的配置&#xff08;最新版特别全&#xff09;_centos7 配置_Co…

田间气象站的优势与应用

在农业生产中&#xff0c;田间气象站是重要的气象监测工具&#xff0c;它能够对农田间的气象信息进行实时监测和记录&#xff0c;为农民伯伯提供农业生产科学依据。 田间气象站是由多个传感器共同组成&#xff0c;能够收集各项气象参数&#xff0c;包括我们常见的风速、风向、…