字符串、字节流与十六进制字符串的转换: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.mzph.cn/web/57512.shtml

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

相关文章

Elasticsearch分词器基础安装

简介 Elasticsearch (ES) 是一个基于 Lucene 的搜索引擎&#xff0c;分词器是其核心组件之一&#xff0c;负责对文本数据进行分析和处理。 1. 文本分析 分词器将输入的文本拆分成一个个单独的词&#xff08;tokens&#xff09;&#xff0c;以便后续的索引和搜索。例如&#x…

Vue 3:解析

写在前面 Vue 3 是流行的 JavaScript 框架 Vue.js 的最新主要版本。它带来了显著的改进和新功能&#xff0c;增强了开发者体验并使构建复杂应用程序变得更容易。在本文中&#xff0c;我们将深入探讨 Vue 3 中的关键变化和新增功能。 安装 要开始使用 Vue 3&#xff0c;可以通…

五、Go语言快速入门值条件控制

&#x1f4c5; 2024年4月28日 &#x1f4e6; 使用版本为1.21.5 条件判断和循环判断 If/switch条件判断 ⭐️ 和其他语言一样拥有if else if else和switch语句 1️⃣ if else if else func main() {score : 90var ans stringif score > 0 && score < 60 {an…

EfficientNet-B6模型实现ISIC皮肤镜图像数据集分类

项目源码获取方式见文章末尾&#xff01; 回复暗号&#xff1a;13&#xff0c;免费获取600多个深度学习项目资料&#xff0c;快来加入社群一起学习吧。 《------往期经典推荐------》 项目名称 1.【基于opencv答题卡识别判卷】 2.【卫星图像道路检测DeepLabV3Plus模型】 3.【G…

扫雷游戏(C语言详解)

扫雷游戏&#xff08;C语言详解&#xff09; 放在最前面的1、前言&#xff08;扫雷游戏的简介&#xff09;2、扫雷游戏的规则&#xff08;简易版&#xff09;3、代码实现&#xff08;3.1&#xff09;提醒一下&#xff1a;( i ) 提醒1&#xff1a;( ii ) 提醒2&#xff1a; &…

影刀RPA自动化按钮参数详解

文章目录 一、基础识别参数1. 文本内容&#xff08;Text&#xff09;2. ID属性3. Name属性4. Class属性 二、高级定位参数1. XPath路径2. CSS选择器3. 图像识别 三、动态等待参数1. 等待超时2. 重试间隔 四、操作参数1. 点击类型2. 点击位置 五、最佳实践1. 按钮定位优先级2. 常…

WPF+MVVM案例实战(十四)- 封装一个自定义消息弹窗控件(下)

文章目录 1、案例效果2、弹窗控件使用1.引入用户控件2、按钮命令实现 3、总结4、源代码获取 1、案例效果 2、弹窗控件使用 1.引入用户控件 打开 Wpf_Examples 项目&#xff0c;在引用中添加用户控件库&#xff0c;在 MainWindow.xaml 界面引用控件库&#xff0c;代码如下&…

C++(类继承、虚函数、多重继承)

类继承 &#xff08;1&#xff09;当创建一个类时&#xff0c;不需要重新编写新的成员变量和成员函数&#xff0c;只需要新建的类继承了一个已有的类的成员。已有的类称为基类或父类&#xff0c;新建的类称为派生类或子类。 &#xff08;2&#xff09;一个类可以有多个…

经典面试题收集(持续更新)

有一个月没有关注招聘信息了&#xff0c;我感觉还是要持续关注这些内容才行。要知道自己毕业季时想找什么方向的工作&#xff0c;不是一时半会就能确定的。假如现在就到了秋招的时候&#xff0c;面对如此多的招聘信息&#xff0c;你该如何选择&#xff1f; 针对这个情况&#…

Redis 主从同步 问题

前言 相关系列 《Redis & 目录》《Redis & 主从同步 & 源码》《Redis & 主从同步 & 总结》《Redis & 主从同步 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》 什么是主从同步&#xff1f; 主从同步是Redis用于提高数据可用/可靠性…

Go 语言解析 yaml 文件的方法

Go 语言没有内置解析 yaml 文件的功能&#xff0c;实现 yaml 的解析可以使用第三方库 gopkg.in/yaml.v2 和 gopkg.in/yaml.v3。 下面以解析 config.yml 文件为例&#xff0c;演示解析代码的过程。 使用 go get gopkg.in/yaml.v3 添加引用。 在 config 目录下&#xff0c;新增…

深度学习基础—循环神经网络(RNN)

引言 从本系列博客开始&#xff0c;我们将来一起学习一下NLP领域的相关基础知识&#xff0c;NLP领域重要的模型是RNN&#xff0c;在此之前&#xff0c;先来了解一些符号的含义。 1.符号定义 &#xff08;1&#xff09;符号定义 假设建立一个能够自动识别句中人名位置的序列模型…

Web测试和APP测试的区别

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 最近听到有些朋友说&#xff0c;移动端要比web端稍微难一些&#xff0c;涉及到的细节笔记要多&#xff0c;有转去做web测试的想法&#xff0c;看看在具体测试的时…

Linux TCP CC状态机

万字详文&#xff1a;TCP 拥塞控制详解 - 知乎bcc/tools/tcpcong.py at master iovisor/bccbcc/tools/tcpcong_example.txt at master iovisor/bcc 1.状态机 2.tcp map 拥塞算法历史 1974年&#xff0c;3次握手被提出&#xff1b;1978年&#xff0c;TCP和IP拆分成TCP/IP&…

如何进行商标注册?

商标注册是一个法律程序&#xff0c;用于保护品牌名称、标志或符号&#xff0c;确保其在商业活动中的独特性和识别度。以下是商标注册的基本流程和注意事项&#xff1a; 商标查询&#xff1a;在提交商标注册申请之前&#xff0c;建议进行商标查询&#xff0c;以了解在先权利情…

视频设备一体化监控运维方案

随着平安城市、雪亮工程等项目建设的号召&#xff0c;视频监控系统的建设如火如荼地开展。无论在公共场所、企业单位、住宅小区、矿山工地还是交通枢纽&#xff0c;视频监控系统已成为保障安全、维护秩序和提升管理效率的重要工具。但由于对视频监控系统中的前端设备&#xff0…

深度数据修复软件哪个好?盘点2024年好用的4个数据恢复工具。

深度数据修复软件可以帮助用户深入存储设备&#xff0c;找回丢失的数据。它们可以有效解决很多场景下的数据丢失问题&#xff0c;如果大家平时会有数据丢失的情况&#xff0c;可以用这几个工具去尝试一些自己进行数据恢复。 1、福昕深度恢复软件 直通车&#xff1a;http://www…

leetcode-73-矩阵置零

题解&#xff1a; 1、初始化变量ls_row与ls_col分别用来存储元素0的所在行与列&#xff1b; 2、获取矩阵的行数M与列数N&#xff1b; 3、遍历矩阵matrix的每一个元素。如果这个元素为0&#xff0c;则将该元素所在行数append到ls_row&#xff0c;所在列append到ls_col。 4、…

什么是 Spring Cloud Bus?我们需要它吗?

在微服务架构中&#xff0c;Spring Cloud 提供了一系列强大的工具和组件来帮助我们构建和管理分布式系统。其中&#xff0c;Spring Cloud Bus 就是一个非常有用的组件&#xff0c;但很多人对它可能还不太了解。那么&#xff0c;什么是 Spring Cloud Bus&#xff1f;我们真的需要…

树莓派基本设置--2. raspi-config工具介绍

raspi-config是树莓派操作系统Raspberry Pi OS中预装的配置工具&#xff1b;raspi-config提供了一种简单便捷的命令行界面来管理树莓派系统的配置&#xff0c;使用户可以轻松地定制和优化其系统设置。 如果使用的是树莓派桌面系统&#xff0c;可以直接在桌面左上角的应用菜单&…