当前位置: 首页 > news >正文

16进制编码,分别解析为gb2312和utf8两种编码

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iconv.h> #include <errno.h> // 辅助函数:将16进制字符串转换为字节数组 // 例如:"E4BDA0" -> {0xE4, 0xBD, 0xA0} int hex_to_bytes(const char *hex, unsigned char *bytes) { size_t len = strlen(hex); if (len % 2 != 0) return -1; // 长度必须为偶数 for (size_t i = 0; i < len; i += 2) { sscanf(hex + i, "%2hhx", &bytes[i / 2]); } return len / 2; } // 函数 1: 解析 UTF-8 16进制字符串 // 因为 Linux 终端本身是 UTF-8,所以直接转换并打印即可 void parse_as_utf8(const char *hex_str) { int len = strlen(hex_str) / 2; unsigned char *bytes = (unsigned char *)malloc(len + 1); int byte_len = hex_to_bytes(hex_str, bytes); if (byte_len >= 0) { bytes[byte_len] = '\0'; // 添加字符串结束符 printf("UTF-8 解析结果: %s\n", (char *)bytes); } else { printf("UTF-8 解析失败: 无效的16进制输入\n"); } free(bytes); } // 函数 2: 解析 GB2312 16进制字符串 // 需要通过 iconv 将 GB2312 转换为 UTF-8 才能在终端显示 void parse_as_gb2312(const char *hex_str) { int in_len = strlen(hex_str) / 2; unsigned char *in_bytes = (unsigned char *)malloc(in_len); if (hex_to_bytes(hex_str, in_bytes) < 0) { printf("GB2312 解析失败: 无效的16进制输入\n"); free(in_bytes); return; } // 准备 iconv 转换 // 使用 "GB18030" 替代 "GB2312" 兼容性更好(涵盖了GBK和所有汉字) iconv_t cd = iconv_open("UTF-8", "GB18030"); if (cd == (iconv_t)-1) { perror("iconv_open 失败"); free(in_bytes); return; } size_t in_left = in_len; size_t out_left = in_len * 3 + 1; // UTF-8 最长占3-4字节,分配充足空间 char *out_buf = (char *)malloc(out_left); char *out_ptr = out_buf; char *in_ptr = (char *)in_bytes; memset(out_buf, 0, out_left); // 执行转换 if (iconv(cd, &in_ptr, &in_left, &out_ptr, &out_left) == (size_t)-1) { printf("GB2312 解析失败: 转换过程中出错\n"); } else { printf("GB2312 解析结果: %s\n", out_buf); } iconv_close(cd); free(in_bytes); free(out_buf); } int main() { // 测试数组 const char *hex_array[] = { "E4BDA0E5A5BD", // "你好" 的 UTF-8 编码 "B0A1C4DE", // "啊呢" 的 GB2312/GBK 编码 NULL }; for (int i = 0; hex_array[i] != NULL; i++) { printf("原始16进制: %s\n", hex_array[i]); // 分别调用两个解析函数 parse_as_utf8(hex_array[i]); parse_as_gb2312(hex_array[i]); printf("--------------------------\n"); } return 0; }
http://www.jsqmd.com/news/1159867/

相关文章:

  • 66、<简单>螺旋方阵
  • 阿里云Happy Horse文生视频模型实战:从API调用到AI电影节作品创作
  • 基于Dify与DeepSeek构建高可用知识库:从RAG原理到工程实践
  • TPA3128D2与PIC18F4455组合的音频放大器设计指南
  • 收藏!小白程序员必看:如何在大模型浪潮中“从尝鲜到赚钱”
  • 如何在现代电脑上通过Xenia Canary重温Xbox 360经典游戏?实用安装与优化指南
  • 阿里7月10日全面禁用Claude:后门、地缘与国产替代的三重信号
  • 全志 A40i 开发板 PhoenixSuit 1.1.0 线刷实战:Windows 驱动安装与 2 种烧录模式详解
  • Windows 11电池优化神器:如何用Energy Star X延长40%续航时间
  • 端午粽香高端实测|节庆送礼怎么选?安徽尊记鲜粽品牌优选标杆指南 - 安互工业信息
  • Android 14 适配避坑指南:从OpenJDK 17到广播接收器的5个必改项
  • 《摸鱼王》插件 vs 浏览器原生阅读模式:2种隐蔽阅读方案对比评测
  • GTX时钟网络深度排错:从IBUFDS_GTE2到TXOUTCLK的5个关键信号实测
  • Simuro足球C++策略DLL生成与加载:从代码编译到平台启动的5步避坑指南
  • Python websockets 库实现视频推流:局域网 200ms 低延迟网页监控方案
  • Sqribble:面向结构化文档的轻量级文档操作系统
  • 青岛闲置高端腕表回收 全年无休营业 就近门店交易更安全 - 开心测评
  • 装饰画点钻设备的技术演进与选型分析:从手工到智能的产业升级路径
  • 74LS191/138/151 芯片应用:Multisim 仿真手机号显示电路的3种实现与性能实测
  • Vector Flash Bootloader 集成实战:5步完成 ECU 内存布局与双向量表配置
  • 高端月饼重点推荐实测|节庆送礼怎么选?正宗徽式月饼品牌优选标杆指南“安徽尊记农业发展有限公司品牌”、“靠谱月饼厂家品牌推荐”、“高性价比月饼产地厂家 合肥 黄山 芜湖” - 安互工业信息
  • 3步搞定Vim插件管理:VAM插件管理器完全指南
  • Gemini Mac版深度解析:原生AI如何实现全局无缝协同
  • Python 3.11 + OpenCV 游戏自动化脚本:基于图像识别的5步点击循环实战
  • 2026南京黄金回收新规落地零损耗无扣费|正规高价回收认准合扬直营 - 开心测评
  • 计算机毕业设计之基于SSM的沈阳市体育馆管理系统
  • Unity URP静态PBR贴花系统:Driven Decals插件实战与性能优化指南
  • Windows右键菜单终极清理指南:ContextMenuManager快速解决菜单杂乱问题
  • Ubuntu 24.04下ROS2 Jazzy环境搭建与实战指南
  • 清奢黄金回收布局扬州6家店,淮左名都的黄金宴席 - 新芸鼎珠宝首饰