首页 > 其他分享 >base16编码和解码-支持中文

base16编码和解码-支持中文

时间:2024-03-11 23:03:14浏览次数:24  
标签:编码 const 解码 base16 char size data out

 

这是一个base16 编码/解码 的方法。而且支持中文的编码和解码。

 

代码由chatgpt-3.5生成:

#include <iostream>
#include <string>

const std::string base16 = "0123456789ABCDEF";

void Base16Encode(const std::string& data, std::string& out) {
    for (unsigned char d : data) {
        char a = base16[d >> 4];
        char b = base16[d & 0x0F];
        out.push_back(a);
        out.push_back(b);
    }
}

void base16Decode(const std::string& data, std::string& out) {
    for (size_t i = 0; i < data.size(); i += 2) {
        int hi = data[i] <= '9' ? data[i] - '0' : (data[i] & 0xDF) - 'A' + 10;
        int lo = data[i + 1] <= '9' ? data[i + 1] - '0' : (data[i + 1] & 0xDF) - 'A' + 10;
        out.push_back((hi << 4) | lo);
    }
}

void testStr(const std::string& original) {
    std::string encoded;
    Base16Encode(original, encoded);
    std::cout << "Encoded string: " << encoded << std::endl;

    std::string decoded;
    base16Decode(encoded, decoded);
    std::cout << "Decoded string: " << decoded << std::endl;
}

int main() {
    const std::string original = "这test这是一个测试字符串。henry20240311串"; // 中文字符串
    testStr(original);

    const std::string original2 = "test这是一个测试字符串。henry20240311串";
    testStr(original2);

    const std::string original3 = "这test这是一个测试字符串。henry20240311";
    testStr(original3);


    return 0;
}

 


 

这是C风格的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const char base16[] = "0123456789ABCDEF";

void Base16Encode(const unsigned char* data, int size, unsigned char* out) {
    for (int i = 0; i < size; i++) {
        unsigned char d = data[i];
        char a = base16[d >> 4];
        char b = base16[d & 0x0F];
        out[i * 2] = a;
        out[i * 2 + 1] = b;
    }
}

void base16Decode(const unsigned char* data, int size, unsigned char* out) {
    for (int i = 0; i < size; i += 2) {
        int hi = data[i] <= '9' ? data[i] - '0' : (data[i] & 0xDF) - 'A' + 10;
        int lo = data[i + 1] <= '9' ? data[i + 1] - '0' : (data[i + 1] & 0xDF) - 'A' + 10;
        out[i / 2] = (hi << 4) | lo;
    }
}

void testStr(const char* original) {
    int original_size = strlen(original);
    unsigned char encoded[original_size * 2 + 1]; // Allocate space for encoded string
    Base16Encode((const unsigned char*)original, original_size, encoded);
    encoded[original_size * 2] = '\0'; // Null terminate encoded string
    printf("Encoded string: %s\n", encoded);

    unsigned char decoded[original_size + 1]; // Allocate space for decoded string
    base16Decode(encoded, original_size * 2, decoded);
    decoded[original_size] = '\0'; // Null terminate decoded string
    printf("Decoded string: %s\n", decoded);
}

int main() {
    const char* original = "这test这是一个测试字符串。henry20240311串"; // 中文字符串
    testStr(original);

    return 0;
}

 

strlen是C标准库中的一个函数,用于计算字符串的长度。它的原型定义在头文件<string.h>中:

size_t strlen(const char *str);

strlen函数接受一个指向以 null 结尾的字符串的指针作为参数,并返回该字符串中字符的数量,不包括 null 终止符。它会从字符串的开头开始遍历,直到遇到 null 终止符为止,然后返回遍历过程中统计的字符数量。

例如,如果我们有一个字符串"hello",它实际上是一个字符数组,内容是{'h', 'e', 'l', 'l', 'o', '\0'},其中'\0'是 null 终止符。那么调用strlen("hello")会返回 5,因为在遍历到 null 终止符之前,它统计了5个字符。

strlen函数对于以 null 结尾的字符串非常有用,可以帮助我们确定字符串的实际长度,而不需要在代码中显式指定字符串的长度。

标签:编码,const,解码,base16,char,size,data,out
From: https://www.cnblogs.com/music-liang/p/18067296

相关文章

  • 嘿!AI 编码新玩法上线!
    随着AI智能浪潮到来,AI编码助手成为越来越多开发者的必备工具,将开发者从繁重的编码工作中解放出来,极大地提高了编程效率,帮助开发者实现更快、更好的代码编写。通义灵码正是这样一款基于阿里云通义代码大模型打造的智能编码助手,由海量优秀开源代码数据集和编程教科书训练,可根据......
  • 辨析Java与网络通信中的编码与解码
    在Java字符流上下文中的编码和解码,以及在网络通信中的编码概念。在Java中,当我们谈论字符流(如Reader和Writer)时,编码和解码主要涉及将字符数据转换为字节数据,以及将字节数据转换回字符数据。这是因为字符在计算机内部是以字节的形式存储和传输的,而字符流提供了一种更高级别的抽象,使......
  • ubuntu c语言 opencv实现h265 编码
    在Ubuntu上使用C语言和OpenCV实现H.265编码,你可以遵循以下步骤:安装依赖:首先确保你的系统已经安装了Ubuntu最新版本,并更新所有包列表。安装FFmpeg,因为OpenCV使用FFmpeg来处理视频编码。可以使用以下命令安装:复制sudoaptupdatesudoaptinstallffmpeg安装OpenCV:OpenCV库本......
  • FFMPEG视音频编解码零基础学习方法
    背景知识FFmpeg是一个强大的开源软件项目,包含一套大量的库和程序,用于处理多媒体数据。它可以编码、解码、流式传输、过滤和播放几乎任何人类和及其创建的音频和视频。使用FFMPEG作为内核视频播放器Mplayer、ffplay射手播放器暴风影音KMPlayerQQ影音使用FFMPEG作为......
  • .net 各种文件编码方式读取txt文件
    txt文件,有不同的编码方式,导入到系统有时不识别,故做以下适配。#region字节流编码格式判断///<summary>///获取txt文件内容行///兼容不同的编码方式///</summary>///<paramname="stream"></param>///<paramname="i......
  • GB 2312字符集:中文编码的基石
    一、GB2312字符集的背景GB2312字符集是中国国家标准委员会于1980年发布的一种中文字符集,是中国大陆最早的中文字符集之一。GB2312字符集的发布填补了中国大陆中文编码的空白,为中文信息处理提供了基础。标准中文电码查询|一个覆盖广泛主题工具的高效在线平台(amd794.com)h......
  • P001-根据编码规则自动生成ID的函数
    --创建sequenceCREATESEQUENCEseq_1765319714616074242INCREMENT1MINVALUE3MAXVALUE9999START3NOCYCLENOCACHE;--变更sequenceALTERSEQUENCEseq_1765319714616074242INCREMENT1MINVALUE10MAXVALUE9999START10NOCYCLENOCACHE;--删除sequence......
  • 2024/3/5如何在excel中支持base64编码解码
    在excel中按alt+f11(打开VisualBasic工具)。添加模块,粘贴一下代码`FunctionEncodeBase64(text$)DimbWithCreateObject("ADODB.Stream").Open:.Type=2:.Charset="utf-8".WriteTexttext:.Position=0:.Type=1:b=.ReadWithCreateObject("Micr......
  • 基本操作之——Unicode编码
    自版本18.11后,支持UTF-81.字符转Unicode码tuple_ord('s',Ord)dev_clear_window()dev_disp_text('\'s\'的Unicode码为'+Ord,'window','center','center','black','box_color','#00ffffc0......
  • 编码绕过xss说明和htmlspecialchars函数
    html实体编码JS编码1.htmlspecialchars函数把一些预定义的字符转换为html实体预定义的字符&->&amp;"->"'->'<-><>->gt;<script>--><&ltscript&gt默认绕过绕过方式:payload:'onclick='alert(123)'或者&#......