以十六进制表示形式显示 u8 切片

2023-12-01

我需要转换&[u8]到十六进制表示。例如[ A9, 45, FF, 00 ... ].

特质std::fmt::UpperHex没有为切片实现(所以我不能使用std::fmt::format)。铁锈有serialize::hex::ToHex特征,它转换&[u8]到十六进制字符串,但我需要一个具有单独字节的表示。

我可以实现特质UpperHex for &[u8]我自己,但我不确定这有多规范。最规范的方法是什么?


Rust 1.26.0 及更高版本

The :x?可以使用“使用十六进制整数进行调试”格式化程序:

let data = b"hello";
// lower case
println!("{:x?}", data);
// upper case
println!("{:X?}", data);

let data = [0x0, 0x1, 0xe, 0xf, 0xff];
// print the leading zero
println!("{:02X?}", data);
// It can be combined with the pretty modifier as well
println!("{:#04X?}", data);

Output:

[68, 65, 6c, 6c, 6f]
[68, 65, 6C, 6C, 6F]
[00, 01, 0E, 0F, FF]
[
    0x00,
    0x01,
    0x0E,
    0x0F,
    0xFF,
]

如果您需要更多控制或需要支持旧版本的 Rust,请继续阅读。

Rust 1.0 及更高版本

use std::fmt::Write;

fn main() {
    let mut s = String::new();
    for &byte in "Hello".as_bytes() {
        write!(&mut s, "{:X} ", byte).expect("Unable to write");
    }

    println!("{}", s);
}

这可以通过实现格式特征之一来实现(fmt::Debug, fmt::Display, fmt::LowerHex, fmt::UpperHex等)在包装结构上并有一个小构造函数:

use std::fmt;

struct HexSlice<'a>(&'a [u8]);

impl<'a> HexSlice<'a> {
    fn new<T>(data: &'a T) -> HexSlice<'a>
    where
        T: ?Sized + AsRef<[u8]> + 'a,
    {
        HexSlice(data.as_ref())
    }
}

// You can choose to implement multiple traits, like Lower and UpperHex
impl fmt::Display for HexSlice<'_> {
    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
        for byte in self.0 {
            // Decide if you want to pad the value or have spaces inbetween, etc.
            write!(f, "{:X} ", byte)?;
        }
        Ok(())
    }
}

fn main() {
    // To get a `String`
    let s = format!("{}", HexSlice::new("Hello"));

    // Or print it directly
    println!("{}", HexSlice::new("world"));

    // Works with
    HexSlice::new("Hello"); // string slices (&str)
    HexSlice::new(b"Hello"); // byte slices (&[u8])
    HexSlice::new(&"World".to_string()); // References to String
    HexSlice::new(&vec![0x00, 0x01]); // References to Vec<u8>
}

您甚至可以更大胆地创造一个延伸特质:

trait HexDisplayExt {
    fn hex_display(&self) -> HexSlice<'_>;
}

impl<T> HexDisplayExt for T
where
    T: ?Sized + AsRef<[u8]>,
{
    fn hex_display(&self) -> HexSlice<'_> {
        HexSlice::new(self)
    }
}

fn main() {
    println!("{}", "world".hex_display());
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

以十六进制表示形式显示 u8 切片 的相关文章

随机推荐

  • SQL Server 查询性能

    我在繁忙的数据库上有一个存储过程 它经常在昂贵的查询列表中名列前茅 以某种方式 查询非常简单 它采用单个参数 ID int 即表的主键 并选择与该ID匹配的记录 主键是一个带有聚集索引的身份字段 所以我很困惑如何进一步优化它 查询如下 CR
  • 从 Google 电子表格单元格调用 Google App 脚本库

    在 Google 电子表格中尝试新的库功能 我已经包含了一个标识符为 Test 的库 并且该库实现了函数 foo 在电子表格单元格中输入 Test foo 会出现错误 未知函数名称 TEST FOO 如果我在电子表格中创建一个函数来包装库函
  • 分割汉字

    如何使用 JavaScript 将外来字符 例如中文 拆分为单独的数组值 split 似乎对英语很有效 但对中文则不太适用 请参阅下面两个字符串的结果 a 你好 b 你好吗 splitString text split RESULT hel
  • Iris 框架实现中指针接收器和值接收器的差异[重复]

    这个问题在这里已经有答案了 最近在研究Iris框架 我在实现Handler的时候遇到了一个问题 就像下面这样 package controller import github com kataras iris type Pages stru
  • AsyncTask 内的 Android AlertDialog

    我有一个带有复选框的列表视图 对于每个复选框 大约有 3 个 它都有一个特定的 AsyncTask 我从来都不知道用户选择了哪些复选框 所以我不能将 AlertDialog 放在异步任务的末尾 因为我永远不知道用户是否只选择了一个复选框 或
  • UIBarButtonItem 显示为蓝色方块,而不是我想要的图像(界面编辑器)

    So I have added a button to my nav bar in the interface editor however when I set the image I simply get a blue box The
  • @AfterThrowing 未按预期工作

    我想使用AOP来拦截服务层中抛出的所有运行时异常并作为域异常重新抛出 Aspect Component public class ExceptionWrapperInterceptor Pointcut within service pub
  • SwiftUI:如何以编程方式更改 rootview 控制器

    我试图在用户注销后将 rootview 控制器更改为不同的屏幕 if let window UIApplication shared windows first window rootViewController UIHostingCont
  • PostgreSQL:忽略左外自连接更新

    我要更新专栏leaf category with TRUE其中类别不是父类别 它作为一个选择语句工作 select c1 id c1 name c1 slug c1 level c2 parent id c2 name c2 slug c2
  • 从App World下载的应用程序是否共享项目?

    我的公司创建了多个 BlackBerry 应用程序 它们都使用一些共享的 Java 项目 最近 我们一直在追查一个错误 我们推测该错误可能是由使用其中一个项目的旧版本的应用程序引起的 我的问题是 从 App World 单独下载的两个应用程
  • 用于刷新访问令牌的 Google 电子表格应用程序脚本

    我正在使用以下 HTTP 请求从关联的 YouTube 频道检索数据 https www googleapis com youtube analytics v1 reports ids channel 3D 3D MY ASSOCIATED
  • 动态条件 - 过滤 Excel VBA

    我需要根据相同的标准进行过滤 但标准的值在我收到的数据中并不总是相同 因此它们需要是动态的 for eg 将 Crit1 调暗为字符串 暴击1 So that Selection AutoFilter 字段 4 Criteria1 crit
  • 浮点值作为字典键

    我正在开发一个用于分析微量滴定板的课程 这些样本在单独的文件中进行描述 并且条目用于有序字典 关键之一是 pH 值 通常以浮点数形式给出 例如6 8 我可以将其导入为十进制Decimal 6 8 为了避免浮动作为字典键 另一种解决方案是将点
  • 从 MP3 文件/ID3 标签获取专辑封面

    我正在尝试从 MP3 文件获取专辑封面 在这种情况下我使用AVAudioPlayer播放文件 这是代码我以为将获得专辑封面 MPMusicPlayerController controller MPMusicPlayerController
  • Laravel Socialite 2.0 Facebook 身份验证仅返回 ID 和名称

    我正在使用 Laravel 的 Socialite 包 版本 2 0 0 它在 google 和 github 上运行得很好 但是当我尝试使用 facebook 登录时 我得到了这个 ErrorException in FacebookPr
  • PHP Carbon 需要分钟数并转换为天数

    我正在尝试使用 Carbon 将分钟数转换为天数 minutes 1400 我想做如下的事情 当然 这是行不通的 Carbon gt minutes minutes gt days 我找不到这方面的例子 谢谢你的帮助 未测试 但快速浏览一下
  • 如何启用MySQL客户端自动重新连接MySQLdb?

    我遇到了 PHP 的方法 my bool reconnect 1 mysql options mysql MYSQL OPT RECONNECT reconnect 但 MySQLdb python mysql 就不那么幸运了 有人可以提供
  • 如何在webpack中使用child_process

    我试图在托管 Web 应用程序时在目录中运行命令行函数 但是当我尝试运行以下代码时 它会抛出 无法解析模块 child process var exec require child process exec 它与 Webpack 一起运行
  • ArrayList 与 LinkedList

    我正在关注一个上一篇文章对此说 对于链表 得到的是 O n 加法的时间复杂度为 O 1 删除是 O n Iterator remove 的复杂度为 O 1 对于数组列表 获取的时间复杂度为 O 1 add 的分摊时间复杂度为 O 1 但最坏
  • 以十六进制表示形式显示 u8 切片

    我需要转换 u8 到十六进制表示 例如 A9 45 FF 00 特质std fmt UpperHex没有为切片实现 所以我不能使用std fmt format 铁锈有serialize hex ToHex特征 它转换 u8 到十六进制字符串