将 unsigned char* 转换为可读字符串 & 这个函数在做啥

Posted

技术标签:

【中文标题】将 unsigned char* 转换为可读字符串 & 这个函数在做啥【英文标题】:Converting an unsigned char* to readable string & whats this function doing将 unsigned char* 转换为可读字符串 & 这个函数在做什么 【发布时间】:2011-10-03 01:31:04 【问题描述】:

我已经搜索了很多以了解如何将我的 unsigned char* 转换为可打印的十六进制字符串。到目前为止,我稍微了解了它的工作原理以及有符号和无符号字符之间的区别。

你能告诉我我找到的这个函数是做什么的吗?并帮助我开发一个将 unsigned char*(散列字符串)转换为可打印字符串的函数?

以下函数是否执行此操作: - 它遍历 char 数组字符串的每个第二个字符 - 在每个循环中,它读取字符串 [x] 位置处的字符,将其转换为无符号数(精度为 2 位小数),然后将转换后的字符(数字?)复制到变量 uChar。 - 最后它将 unsigned char uChar 存储在十六进制字符串中

void AppManager :: stringToHex( unsigned char* hexString, char* string, int stringLength ) 
     
    // Post:

    unsigned char uChar = 0;           

    for ( int x = 0; x<stringLength; x+=2 )     
             
        sscanf_s(&string[x], "%02x", &uChar);         
        hexString[x] = uChar;     
     

 

所以我猜这意味着它将字符串中的字符转换为无符号(& 2dcp)以确保它可以正确存储十六进制字符串。为什么要保留 2 位小数,并且不会从有符号(如果该字符是有符号的)到无符号的简单转换导致完全不同的字符串?

如果我有一个 unsigned char*,我该如何将它转换成可以让我在屏幕上打印出来的东西?

【问题讨论】:

【参考方案1】:

那些不是小数位,它们是数字。您是在说“不要给我一个短于 2 的字符串;如果它短于 2 位数字,则用零填充它。”

如果你有一个十六进制序列0x0A,它实际上会打印0A,而不仅仅是A

此外,这里没有有符号/无符号转换。十六进制字符串是十六进制字符串 - 它们没有符号。它们是数据的二进制表示,根据它们的解释方式,它们可能被读取为二进制补码有符号整数、无符号整数、字符串或其他任何内容。

【讨论】:

十六进制“字符串”实际上通常是人类可读的编码(否则“十六进制”部分根本没有意义)。我当然不会称其为“数据的二进制表示”,至少因为它们不如作为基本数值。至少不那么直接。希望这是有道理的。 让我更好地表述为:“十六进制字符串是底层二进制数据的不变、更紧凑、更人性化的视图” 所以在那个函数中我们只是从二进制字符串转换为十六进制字符串?而不是从 char* 到 unsigned char*? 所以实际上我们正在这样做:从 ABCD(十进制 65、66、67、68)到 ABCD(十六进制 0x41、0x42、0x43、0x44)正确吗? 是和不是。您正在这样做,但它不必首先是字符列表。 “unsigned char *”通常用于表示“指向任何东西的指针”或“指向某些字节的指针”,因此您实际上可以将指针传递给整数并查看 C++ 如何以二进制形式存储该整数。您可以将指针传递给您想要的任何内容 - 此函数不会将您发送的内容视为字符,并且对任何内容都同样有效。

以上是关于将 unsigned char* 转换为可读字符串 & 这个函数在做啥的主要内容,如果未能解决你的问题,请参考以下文章

改进将字符串转换为可读 url

如何将智能合约返回的地址转换为可读字符串?

将 unicode 转换为可读字符串

如何将八位字节字符串转换为可读字符串[重复]

将 unsigned int + 字符串转换为 unsigned char 向量

如何在 Swift 中将多字符数字格式转换为可读的字符串?