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

Rust: [u8] 与 String 相互转换

在 Rust 中,[u8]String 是两种不同的数据类型,用于表示不同的数据结构。[u8] 是一个字节数组,通常用于表示二进制数据或字节字符串,而 String 是一个 UTF-8 编码的字符串。

以下是如何在 [u8]String 之间进行相互转换的示例:

[u8] 转换为 String

要从 [u8] 转换为 String,你需要确保 [u8] 数组中的字节是有效的 UTF-8 编码。如果数据是有效的 UTF-8,你可以使用 String::from_utf8 方法。如果数据可能不是有效的 UTF-8,你可以使用 String::from_utf8_lossy 方法,它会替换无效的字节。

use std::string::FromUtf8Error;

fn u8_to_string(bytes: &[u8]) -> Result<String, FromUtf8Error> {
    String::from_utf8(bytes.to_vec())
}

fn main() {
    let bytes = b"hello world";
    match u8_to_string(bytes) {
        Ok(s) => println!("String: {}", s),
        Err(e) => println!("Error: {:?}", e),
    }
}

如果你不介意丢失数据,可以使用 String::from_utf8_lossy

use std::string::String;

fn u8_to_string_lossy(bytes: &[u8]) -> String {
    String::from_utf8_lossy(bytes).to_string()
}

fn main() {
    let bytes = vec![0x68, 0x65, 0x6C, 0xFF, 0x6F]; // 'hello' with an invalid byte 0xFF
    let s = u8_to_string_lossy(&bytes);
    println!("String (lossy): {}", s); // Output will replace invalid bytes
}

String 转换为 [u8]

要从 String 转换为 [u8],你可以使用 Stringas_bytes 方法,这会返回一个 &[u8] 切片,或者你可以使用 into_bytes 方法,这会消耗 String 并返回一个 Vec<u8>

fn string_to_u8_slice(s: &String) -> &[u8] {
    s.as_bytes()
}

fn string_to_u8_vec(s: String) -> Vec<u8> {
    s.into_bytes()
}

fn main() {
    let s = String::from("hello world");
    let bytes_slice = string_to_u8_slice(&s);
    let bytes_vec = string_to_u8_vec(s.clone());

    println!("Bytes slice: {:?}", bytes_slice);
    println!("Bytes vec: {:?}", bytes_vec);
}

总结

  • 使用 String::from_utf8 将有效的 UTF-8 字节数组转换为 String
  • 使用 String::from_utf8_lossy 将可能不是有效 UTF-8 的字节数组转换为 String,但会替换无效字节。
  • 使用 String::as_bytes 获取 &[u8] 切片。
  • 使用 String::into_bytesString 转换为 Vec<u8>

这些方法应满足你在 Rust 中处理 String[u8] 相互转换的大部分需求。


http://www.kler.cn/news/368610.html

相关文章:

  • 洛谷 P3130 [USACO15DEC] Counting Haybale P
  • 【零售和消费品&软件包】快递包装类型检测系统源码&数据集全套:改进yolo11-HSPAN
  • XQT_UI 组件|02| 按钮 XPushButton
  • 【数据库】数据操作语言DML MySQL函数介绍
  • python kafka 发送/接收 消息
  • MySQL主主SQL线程异常修复大作战,一失足成千古恨啊!
  • JavaScript(操作元素属性:样式style,className,classList,表单元素,自定义属性,间歇函数)注册用户协议同意倒计时
  • 【论文笔记】MLSLT: Towards Multilingual Sign Language Translation
  • 数据结构之 二叉树详解一 介绍篇
  • 如何提高游戏的游戏性
  • 电动汽车与软件定义汽车(SDV)时代的汽车行业变革
  • 【机器学习-无监督学习】自编码器
  • First - Word Fall - Through ( FWFT ) Read Operation
  • 【制造业&PPE】施工安全防护装备检测系统源码&数据集全套:改进yolo11-RVB-EMA
  • ubuntu20上部署gitlab并开启ipv6访问
  • 鸿蒙生态开发以及技术栈介绍
  • 图像平滑处理
  • 关于Drawio调整圆角弧度
  • 突破AI极限!GPT写的英语作文在全国大学生大赛中得分99!
  • No.19 笔记 | WEB安全 - 任意文件操作详解 part 1
  • JAVA基础面试题准备
  • SQL进阶技巧:巧用异或运算解决经典换座位问题
  • C语言数据结构学习:单链表
  • 【Ubuntu】服务器系统重装SSHxrdpcuda
  • C语言 | Leetcode C语言题解之第507题完美数
  • 资源所有者管理共享交换机