字符串、字节流与十六进制字符串的转换:Python、C 和 Go 的实现对比20241029

字符串、字节流与十六进制字符串的转换:Python、C 和 Go 的实现对比

引言

在数据处理过程中,字符串、字节流和十六进制字符串之间的转换至关重要。这些转换在网络传输、文件存储和数据处理等场景中具有广泛的应用。本文将通过 Python、C 和 Go 三种语言的示例,比较它们的实现方式,并探讨转换后数据的存储变化和长度变化。这将帮助开发者更好地理解数据表示和转换的底层逻辑。

1. 字符串与字节流的基础

数据类型示例存储长度
字符串"1234"4 字节
字节流b"1234"4 字节
十六进制字符串"31323334"8 字节
转换为字节流bytes.fromhex("31323334")4 字节
字节流转换为十六进制b"1234".hex()8 字节

2. 各语言实现对比

2.1 Python 实现

def string_to_bytes(s: str) -> bytes:"""将字符串转换为字节流"""return s.encode('utf-8')def bytes_to_string(b: bytes) -> str:"""将字节流转换为字符串"""return b.decode('utf-8')def hex_to_bytes(hex_str: str) -> bytes:"""将十六进制字符串转换为字节流"""return bytes.fromhex(hex_str)def bytes_to_hex(b: bytes) -> str:"""将字节流转换为十六进制字符串"""return b.hex()# 示例
string_data = "1234"
byte_data = string_to_bytes(string_data)
hex_data = "31323334"
byte_from_hex = hex_to_bytes(hex_data)
hex_from_bytes = bytes_to_hex(byte_data)print(f"字符串: {string_data}, 长度: {len(string_data)} 字节")
print(f"字节流: {byte_data}, 长度: {len(byte_data)} 字节")
print(f"十六进制字符串: {hex_data}, 长度: {len(hex_data)} 字节")
print(f"从十六进制转换的字节流: {byte_from_hex}, 长度: {len(byte_from_hex)} 字节")
print(f"字节流转换为十六进制: {hex_from_bytes}, 长度: {len(hex_from_bytes)} 字节")

2.2 C 语言实现

#include <stdio.h>
#include <string.h>
#include <stdlib.h>void string_to_bytes(const char *str, unsigned char *bytes) {strcpy((char *)bytes, str);
}void bytes_to_string(const unsigned char *bytes, char *str) {strcpy(str, (const char *)bytes);
}unsigned char* hex_to_bytes(const char *hex, size_t *length) {*length = strlen(hex) / 2;unsigned char *bytes = malloc(*length);for (size_t i = 0; i < *length; i++) {sscanf(hex + 2*i, "%2hhx", &bytes[i]);}return bytes;
}void bytes_to_hex(const unsigned char *bytes, size_t length, char *hex) {for (size_t i = 0; i < length; i++) {sprintf(hex + 2*i, "%02x", bytes[i]);}hex[2*length] = '\0'; // 添加字符串结束符
}int main() {char str[] = "1234";unsigned char bytes[5]; // 额外字节用于结束符string_to_bytes(str, bytes);char output[5];bytes_to_string(bytes, output);size_t hex_length;unsigned char *byte_from_hex = hex_to_bytes("31323334", &hex_length);char hex_output[9]; // 8 字节 + 1 字节结束符bytes_to_hex(bytes, strlen(str), hex_output);printf("字符串: %s, 长度: %zu 字节\n", str, strlen(str));printf("字节流: %s, 长度: %zu 字节\n", bytes, strlen((char *)bytes));printf("从十六进制转换的字节流: ");for (size_t i = 0; i < hex_length; i++) {printf("%02x ", byte_from_hex[i]);}printf(", 长度: %zu 字节\n", hex_length);printf("字节流转换为十六进制: %s, 长度: %zu 字节\n", hex_output, strlen(hex_output));free(byte_from_hex); // 释放内存return 0;
}

2.3 Go 语言实现

package mainimport ("encoding/hex""fmt"
)func stringToBytes(s string) []byte {return []byte(s)
}func bytesToString(b []byte) string {return string(b)
}func hexToBytes(hexStr string) ([]byte, error) {return hex.DecodeString(hexStr)
}func bytesToHex(b []byte) string {return hex.EncodeToString(b)
}func main() {str := "1234"bytes := stringToBytes(str)output := bytesToString(bytes)byteFromHex, err := hexToBytes("31323334")if err != nil {fmt.Println("转换失败:", err)return}hexFromBytes := bytesToHex(bytes)fmt.Printf("字符串: %s, 长度: %d 字节\n", str, len(str))fmt.Printf("字节流: %v, 长度: %d 字节\n", bytes, len(bytes))fmt.Printf("从十六进制转换的字节流: %v, 长度: %d 字节\n", byteFromHex, len(byteFromHex))fmt.Printf("字节流转换为十六进制: %s, 长度: %d 字节\n", hexFromBytes, len(hexFromBytes))
}

3. 存储变化与长度变化讨论

  • 字符串 "1234":在三种语言中均表示为 4 字节,每个字符占 1 字节,内存中以字符编码存储。

  • 字节流 b"1234":同样在 Python 和 Go 中表示为 4 字节,C 语言中使用字符数组实现,也为 4 字节。

  • 十六进制字符串 "31323334":在三种语言中,该字符串的长度为 8 字节,因为每两个字符表示一个字节。

  • 转换为字节流 bytes.fromhex("31323334"):最终得到的字节流为 4 字节,存储为每个字节的直接表示。

  • 字节流转换为十六进制 (b"31323334").hex:字节流可以通过 .hex() 方法转换为十六进制字符串。这个方法将每个字节的二进制表示转换为两位的十六进制数字,最终形成的字符串长度是字节数的两倍。
    例如:b"1234".hex() 的结果是 “31323334”,长度为 8 字节。


4.字符串、字节流与十六进制字符串的最佳使用场景

4.1 字符串

最佳使用场景:

  • 用户输入和输出:字符串是人类可读的格式,适合处理用户输入和输出,例如在控制台应用、Web 表单等。
  • 文本处理:字符串在处理自然语言文本时非常有效,如文本分析、搜索和替换操作。
  • 数据序列化:在将数据以可读格式存储(如 JSON、XML)时,字符串是理想选择。

注意事项

  • 字符串在存储和处理时可能引入额外的字符编码开销,特别是在涉及多语言支持时。

4.2 字节流

最佳使用场景:

  • 文件 I/O 操作:处理图像、音频、视频等二进制文件时,字节流是必需的。
  • 网络通信:在网络协议(如 TCP/IP)中,数据以字节流的形式传输,适合需要高效数据传输的应用。
  • 加密和解密:字节流是处理加密算法的基础,适合数据安全和隐私保护的场景。

注意事项

  • 需要注意字节流的字节顺序(如大端或小端),以确保数据在不同系统间的兼容性。

4.3 十六进制字符串

最佳使用场景:

  • 调试和日志:在调试或日志记录中,十六进制字符串用于可视化字节流,以便更容易识别数据格式和内容。
  • 网络协议分析:在分析网络数据包时,十六进制表示可以清楚地展示数据的原始二进制格式。
  • 数据表示和传输:在某些 API 或协议中,使用十六进制字符串来表示二进制数据(如在 JSON 中传递二进制信息)。

注意事项

  • 十六进制字符串比字节流占用更多的存储空间,因为每个字节用两个字符表示。

5. 总结

通过对比 Python、C 和 Go 中字符串、字节流和十六进制字符串的实现,我们可以清晰地看到它们在存储和长度方面的变化。这些转换在数据处理、网络编程等场景中极为重要。理解这些基本概念和实现将有助于开发者在实际项目中更高效地处理数据。选择合适的数据表示形式对于提高应用的性能和可读性至关重要。理解每种形式的优缺点和最佳使用场景,将帮助开发者在实际应用中做出更明智的决策。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧用电监控装置:引领0.4kV安全用电新时代

在智能科技日新月异的今天&#xff0c;电力安全与管理正迎来一场前所未有的革新。为0.4kV以下TT、TN系统打造的智慧用电在线监控装置不仅重新定义了电力监控的边界&#xff0c;更为建筑安全用电筑起了一道坚不可摧的防线。 装置集成了单、三相交流电精确测量、四象限电能计量、…

【Linux内核揭秘】深入理解命令行参数和环境变量

文章目录 命令行参数什么是命令行参数main函数的参数 环境变量什么是环境变量常见的环境变量PATHHOMESHELLPWDOLDPWD 本地变量总结 命令行参数 什么是命令行参数 形如这样的命令后面带的选项就是命令行参数。 首先我们要了解一下命令行参数的原理。 我们知道像ls,mkdir,touch等…

leetcode57:插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

探熵科技|以科技赋能销售,创造卓越业绩。

发展 在当今时代&#xff0c;AI 和大数据技术迅猛发展&#xff0c;各行业与大数据技术的融合已成为推动企业发展的重要力量。 天眼销 探熵科技作为一家专注于商业数据服务的专业公司&#xff0c;始终致力于为企业和个人提供高质量的数据解决方案。我们凭借深厚的技术实力和对…

Nginx+Lua脚本+Redis 实现自动封禁访问频率过高IP

1 、安装OpenResty 安装使用 OpenResty&#xff0c;这是一个集成了各种 Lua 模块的 Nginx 服务器&#xff0c;是一个以Nginx为核心同时包含很多第三方模块的Web应用服务器&#xff0c;使用Nginx的同时又能使用lua等模块实现复杂的控制。 &#xff08;1&#xff09;安装编译工具…

批量剪辑视频软件源码搭建全解析,支持OEM

一、引言 在当今数字化内容创作的时代&#xff0c;视频制作的需求呈爆发式增长。无论是社交媒体上的短视频创作者&#xff0c;还是专业的视频制作团队&#xff0c;都面临着大量视频剪辑的任务。批量剪辑视频软件应运而生&#xff0c;它能够显著提高视频剪辑的效率&#xff0c;满…

C语言笔记(指针题目)例题+图解

本文分为两部分 &#xff0c;第一部分为数组、字符串、字符指针在sizeof和strlen中的辨析&#xff0c;第二部分是一些笔试题目。若有错误&#xff0c;请批评指正。 目录 1.第一部分 1.1.数组名的使用 1.1.1一维整型数组在sizeof中的使用 1.1.2一维字符数组在sizeof中的使用…

015:地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework安装教程

摘要&#xff1a;本文详细介绍地理信息系统开发平台ArcGIS Engine10.2与ArcGIS SDK for the Microsoft .NET Framework的安装流程。 一、软件介绍 ArcGIS Engine 10.2是由Esri公司开发的一款强大的GIS&#xff08;地理信息系统&#xff09;开发平台。该软件基于ArcGIS 10.2 fo…

华为手机卸载系统应用的方法

摘要&#xff1a; 1.手机环境&#xff1a;手机需要开启开发者模式并使用usb连接电脑&#xff0c;并选择文件传输模式 2.电脑环境&#xff1a;使用鸿蒙工具箱进行傻瓜操作或安装adb工具进行命令卸载 3.鸿蒙工具箱和adb工具本质都是使用adb shell pm uninstall -k --user 0 xx…

大数据中心年度数据运营服务项目实施技术方案(183页WORD)

文档介绍&#xff1a; 本大数据中心年度数据运营服务项目实施技术方案&#xff0c;通过构建高效的数据集成与治理平台、数据分析平台以及创新的数据服务模式&#xff0c;旨在为企业内外部用户提供更加精准、高效的数据支持。同时&#xff0c;注重安全与合规保障&#xff0c;确…

【linux网络编程】| socket套接字 | 实现UDP协议聊天室

前言&#xff1a;本节内容将带友友们实现一个UDP协议的聊天室。 主要原理是客户端发送数据给服务端。 服务端将数据再转发给所有链接服务端的客户端。 所以&#xff0c; 我们主要就是要实现客户端以及服务端的逻辑代码。 那么&#xff0c; 接下来开始我们的学习吧。 ps:本节内容…

TIFS-2024 FIRe2:细粒度表示和重组在换衣行人重识别中的应用

总体结论 本文提出了一种新的细粒度表示与重构&#xff08;FIRe2&#xff09;框架&#xff0c;用于解决布变人重识别问题。通过细粒度特征挖掘和属性重构&#xff0c;FIRe2在不依赖任何辅助信息的情况下&#xff0c;实现了最先进的性能。该方法在多个基准数据集上取得了显著的…

一款专业获取 iOS 设备的 UDID 工具|一键获取iPhone iPad设备的 UDID

什么是UDID&#xff1f; UDID&#xff0c;是iOS设备的一个唯一识别码&#xff0c;每台iOS设备都有一个独一无二的编码&#xff0c;这个编码&#xff0c;我们称之为识别码&#xff0c;也叫做UDID&#xff08; Unique Device Identifier&#xff09; 扫描后系统提示输入密码&am…

HTML--浮动布局练习

<!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><style>/* 整个浏览器页…

ES6 变量的解构赋值

数组的解构赋值 对象的解构赋值 字符串的解构赋值

利用游戏引擎的优势

大家好&#xff0c;我是小蜗牛。 在当今快速发展的游戏产业中&#xff0c;选择合适的游戏引擎对开发者来说至关重要。Cocos Creator作为一款功能强大且灵活的游戏引擎&#xff0c;为开发者提供了丰富的工具和资源&#xff0c;使他们能够高效地开发出优秀的游戏。本文将探讨如何…

Python+Selenium+Pytest+POM自动化测试框架封装(完整版)

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 1、测试框架简介 1&#xff09;测试框架的优点 代码复用率高&#xff0c;如果不使用框架的话&#xff0c;代码会显得很冗余。可以组装日志、报告、邮件等一些高…

【鸿蒙HarmonyOS实战:通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程(邀请码)方式教程详解】

鸿蒙HarmonyOS实战&#xff1a;通过华为应用市场上架测试版App实现HBuilder X打包的UniApp项目的app转hap教程&#xff08;邀请码&#xff09;方式详解 在使用uniapp打包的鸿蒙项目的过程中&#xff0c;由于生成的是app文件&#xff0c;而hdc传给鸿蒙HarmonyOS系统需要的是hap文…

【Apache Zookeeper】

一、简介 1、场景 如何让⼀个应⽤中多个独⽴的程序协同⼯作是⼀件⾮常困难的事情。开发这样的应⽤&#xff0c;很容易让很多开发⼈员陷⼊如何使多个程序协同⼯作的逻辑中&#xff0c;最后导致没有时间更好地思考和实现他们⾃⼰的应⽤程序逻辑&#xff1b;又或者开发⼈员对协同…

名词(术语)了解--SSR/CSR

名词&#xff08;术语&#xff09;了解–SSR/CSR 什么是服务器端渲染(SSR)? 服务器端渲染是指由服务器生成完整的 HTML 页面&#xff0c;然后发送给客户端的过程。 这与客户端渲染&#xff08;CSR&#xff09;形成对比&#xff0c;后者主要依赖浏览器端的 JavaScript 来渲染…