如何将普通字符串转换为等效的十六进制字节数组? [复制]
Posted
技术标签:
【中文标题】如何将普通字符串转换为等效的十六进制字节数组? [复制]【英文标题】:How to convert a normal string to an equivalent byte array in hex? [duplicate] 【发布时间】:2021-08-10 12:29:48 【问题描述】:我的问题是如何转换,
string s = "Hello World";
进入
byte b = 0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x20, 0x57, 0x6F, 0x72, 0x6C, 0x64;
如果 C# .NET Core 中有直接的方法,那将非常有帮助。
【问题讨论】:
看起来您正在获取字符串“Hello World”,并将其转换为 ASCII 字节。最简单的方法是Encoding.ASCII.GetBytes("Hello World")
这能回答你的问题吗? How can I convert a hex string to a byte array? 和 Convert string to hex-string in C#
@rcode 再次:byte[]
不是十六进制 - 也不是十进制、八进制或其他任何字符;它是只是价值观;你能真的很清楚你是如何将这个值发送到服务器的吗?你在这里使用什么 API?原始套接字?要么...?如果您告诉我们您想要做什么,我们可能会提供更多帮助。
@rcode 是的,但这只是wireshark 将它们表示为十六进制;它们不会以 十六进制形式发送 - 也不会以八进制、十进制等形式发送;它们作为字节发送;您可以通过Encoding.GetBytes()
获取这些字节,因为已经回答了两次。基本上忘记“十六进制” - 这纯粹是“如何向肉袋人类显示这个值”的事情。它仅存在于wireshark UI中。
@rcode 你很困惑。通过网络发送的值只是数字——十六进制、十进制等,只是人类获取数字并将其转换为可读文本的方式。数字 12 是相同的数字,无论是写成 12
或 0xC
或 014
还是 10 个手指 + 2 个脚趾或其他任何东西。 Wireshark 正在获取它嗅到的数字,并选择在其用户界面中向您显示其十进制表示。如果您希望 Wireshark 向您显示数字的十六进制表示,那是 Wireshark 配置 的事情
【参考方案1】:
短语“十六进制字节数组”没有意义;字节就是字节——它们没有任何内在格式,例如十进制、十六进制、八进制:它们只是值。
但是,你想要的可能是:
byte[] bytes = Encoding.UTF8.GetBytes(s);
要得到hex,可以使用工具再次获取字符串,例如:
string hex = BitConverter.ToString(bytes);
【讨论】:
【参考方案2】:如果你说你想要一个给定字符串的字节数组,你必须指定字节数组应该以哪种方式表示字符串。这称为编码,.NET 框架有一个内置库 (System.Text.Encoding) 用于处理字符串编码操作。
例如,为了获取字符串作为 ASCII 表示,使用这个:
byte[] bytes = Encoding.ASCII.GetBytes(someString);
当然,ASCII 是一组非常有限的字符。
在这里探索您的选择:
Microsoft .NET documentation: Encoding Class
【讨论】:
我正在处理 ASCII 和非 ASCII 字符。用于 msg 内容的 ASCII 和用于标志和命令的非 ASCII。希望这能提供一些清晰的信息。 @rcode 不是真的,不;您正在使用的一些“非 ASCII”字符的示例,以及您期望的编码值是什么,会更有用。 例如我使用 0x06(Decimal = 6, ASCII value = ack) 进行确认。更正我的上述评论:我的意思是不可打印的 ASCII 字符不是非 ASCII。 @rcode k;没关系 - ASCII 或 UTF8 将为此提供相同的输出;有趣的是所有需要 8 位(或更多)位的东西,所以:字符 128 以后 - 特别是(但不限于)国际字符;您要么需要一个特定的代码页,或者类似 UTF8 的东西,但我们无法就哪个没有更多信息提供建议;如果没有字符 >= 128,那么 ASCII 和 UTF8 在功能上是相同的 @MarcGravell 在我继续使用纯文本内容之前,我不会继续使用 ASCII 的 >128 端。但是一旦我输入加密数据,事情就会变得疯狂。以上是关于如何将普通字符串转换为等效的十六进制字节数组? [复制]的主要内容,如果未能解决你的问题,请参考以下文章