C# 生成二维码隐藏ASCII码

news/2025/2/22 17:13:46

在 C# 中生成二维码时,如果需要隐藏或过滤掉 ASCII 码中的控制字符或不可见字符,可以在生成二维码之前对输入文本进行处理。以下是完整的实现步骤和代码示例:


ASCII__4">1. 过滤 ASCII 码中的控制字符

ASCII 码中,0 到 31 以及 127 是控制字符(如换行符、制表符等),这些字符通常是不可见的。我们可以通过过滤这些字符来确保二维码内容不包含隐藏的 ASCII 码。

示例代码:过滤控制字符
using System;
using System.Text;

public static string RemoveControlCharacters(string input)
{
    StringBuilder result = new StringBuilder();
    foreach (char c in input)
    {
        // 只保留可打印字符(ASCII 码 32 到 126)
        if (c >= 32 && c <= 126)
        {
            result.Append(c);
        }
    }
    return result.ToString();
}

// 示例用法
string input = "Hello\x01World\x02!\x03"; // 包含控制字符的字符串
string cleanedInput = RemoveControlCharacters(input);
Console.WriteLine(cleanedInput); // 输出: HelloWorld!

2. 使用 ZXing.Net 生成二维码

ZXing.Net 是一个流行的二维码生成库。我们可以使用它来生成二维码

安装 ZXing.Net

通过 NuGet 安装 ZXing.Net

Install-Package ZXing.Net
示例代码:生成二维码
using System;
using System.Drawing;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;

public static Bitmap GenerateQRCode(string text, int width, int height)
{
    var barcodeWriter = new BarcodeWriterPixelData
    {
        Format = BarcodeFormat.QR_CODE,
        Options = new QrCodeEncodingOptions
        {
            Width = width,
            Height = height,
            Margin = 1
        }
    };

    var pixelData = barcodeWriter.Write(text);
    var bitmap = new Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
    try
    {
        System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
    }
    finally
    {
        bitmap.UnlockBits(bitmapData);
    }

    return bitmap;
}

// 示例用法
string input = "Hello\x01World\x02!\x03"; // 包含控制字符的字符串
string cleanedInput = RemoveControlCharacters(input); // 过滤控制字符
Bitmap qrCodeImage = GenerateQRCode(cleanedInput, 300, 300); // 生成二维码
qrCodeImage.Save("qrcode.png"); // 保存二维码图片

3. 完整示例

以下是将过滤控制字符和生成二维码结合起来的完整示例:

using System;
using System.Drawing;
using System.Text;
using ZXing;
using ZXing.Common;
using ZXing.QrCode;

class Program
{
    static void Main()
    {
        string input = "Hello\x01World\x02!\x03"; // 包含控制字符的字符串
        string cleanedInput = RemoveControlCharacters(input); // 过滤控制字符
        Bitmap qrCodeImage = GenerateQRCode(cleanedInput, 300, 300); // 生成二维码
        qrCodeImage.Save("qrcode.png"); // 保存二维码图片
        Console.WriteLine("二维码已生成并保存为 qrcode.png");
    }

    public static string RemoveControlCharacters(string input)
    {
        StringBuilder result = new StringBuilder();
        foreach (char c in input)
        {
            // 只保留可打印字符(ASCII 码 32 到 126)
            if (c >= 32 && c <= 126)
            {
                result.Append(c);
            }
        }
        return result.ToString();
    }

    public static Bitmap GenerateQRCode(string text, int width, int height)
    {
        var barcodeWriter = new BarcodeWriterPixelData
        {
            Format = BarcodeFormat.QR_CODE,
            Options = new QrCodeEncodingOptions
            {
                Width = width,
                Height = height,
                Margin = 1
            }
        };

        var pixelData = barcodeWriter.Write(text);
        var bitmap = new Bitmap(pixelData.Width, pixelData.Height, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        var bitmapData = bitmap.LockBits(new Rectangle(0, 0, pixelData.Width, pixelData.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppRgb);
        try
        {
            System.Runtime.InteropServices.Marshal.Copy(pixelData.Pixels, 0, bitmapData.Scan0, pixelData.Pixels.Length);
        }
        finally
        {
            bitmap.UnlockBits(bitmapData);
        }

        return bitmap;
    }
}

4. 运行结果

  1. 输入字符串 "Hello\x01World\x02!\x03" 会被过滤为 "HelloWorld!"
  2. 生成二维码并保存为 qrcode.png
  3. 扫描二维码时,内容为 "HelloWorld!",不包含控制字符。

总结

  • 使用 RemoveControlCharacters 方法过滤掉 ASCII 控制字符。
  • 使用 ZXing.Net 生成二维码
  • 确保二维码内容不包含隐藏的 ASCII 码字符。

通过这种方式,你可以生成干净、不包含隐藏 ASCII 码的二维码


http://www.niftyadmin.cn/n/5862567.html

相关文章

postman并发测试某个接口

记录一下在postman中压测某一个接口。 1、新建一个collection&#xff1a; 在collection中创建一个get请求&#xff08;压测该接口&#xff09; 2、 并发请求collection&#xff1a; 双击该collection&#xff0c;点击run按钮 然后&#xff0c;设置并发&#xff1a; 查看结果…

常见千兆光电收发器型号(PON无源光收发光功率范围)

常见千兆光纤收发器型号&#xff0c;详细参考表格&#xff1a; 型号发送功率范围 (dBm)接收灵敏度 (dBm)过载光功率 (dBm)HTB-GS-03-A-3 ~ 3-285HTB-GS-03-B-3 ~ 3-285HTB-GS-05-A0 ~ 5-276HTB-GS-05-B0 ~ 5-276HTB-GS-10-A2 ~ 7-2510HTB-GS-10-B2 ~ 7-2510HTB-GS-204 ~ 9-24…

ubuntu离线安装ollama

现在&#xff0c;我来一步步说明在Ubuntu上离线安装Ollama的具体步骤&#xff1a; 1. 准备环境 确保目标计算机已预先更新至最新状态。可以使用以下命令&#xff1a; sudo apt update && sudo apt upgrade -y 但如果之后无法联网&#xff0c;建议先完成升级和清理缓存…

Part 3 第十二章 单元测试 Unit Testing

概述 第十二章围绕单元测试展开&#xff0c;阐述了单元测试的实践与重要性&#xff0c;通过对比其他测试类型&#xff0c;突出其特点&#xff0c;还介绍了单元测试的最佳实践、避免的反模式以及与测试替身相关的内容&#xff0c;为编写高质量单元测试提供指导。 章节概要 1…

DeepSeek掘金——VSCode 接入DeepSeek V3大模型,附使用说明

VSCode 接入DeepSeek V3大模型,附使用说明 由于近期 DeepSeek 使用人数激增,服务器压力较大,官网已 暂停充值入口 ,且接口响应也开始不稳定,建议使用第三方部署的 DeepSeek,如 硅基流动 或者使用其他模型/插件,如 豆包免费AI插件 MarsCode、阿里免费AI插件 TONGYI Lin…

14.7 LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式

LangChain Experimental 模块解析:解锁 Auto-GPT 开发新范式 关键词:LangChain Experimental、Auto-GPT 实现、自主智能体开发、Agent 架构设计、实验性功能实践 1. LangChain Experimental 模块的定位与核心能力 模块定位解析: #mermaid-svg-4xz2OlZBUFjkBmqw {font-fami…

WPS接入deepseek-OfficeAI助手插件下载

功能简介 OfficeAI 助手 是一款免费的智能AI办公工具软件&#xff0c;专为 Microsoft Office 和 WPS 用户打造。 无论你是在寻找如何输入“打勾&#xff08;√&#xff09;符号”的方法&#xff0c;还是想知道“怎么在插入表格前添加文字”&#xff0c;或者“该用哪个公式”&a…

最新版本Exoplayer扩展FFmpeg音频软解码保姆级教程

ExoPlayer 是一个开源的 Android 媒体播放库&#xff0c;由 Google 开发和维护&#xff0c;用于替代 Android 系统自带的 MediaPlayer。它提供了更强大的功能、更好的性能和更高的灵活性&#xff0c;适用于各种复杂的媒体播放场景。所以被广泛用于各种播放器场景。 最近项目中…