在 C# 中将字符串转换为十六进制字符串

Posted

技术标签:

【中文标题】在 C# 中将字符串转换为十六进制字符串【英文标题】:Convert string to hex-string in C# 【发布时间】:2013-06-04 16:13:08 【问题描述】:

我有一个像“sample”这样的字符串。我想得到 hex 格式的字符串;像这样:

"796173767265"

请给出 C# 语法。

【问题讨论】:

你说的是哪种十六进制格式? ASCII? (您给出的示例不是“样本”的ASCII;那是参考地址吗?)小端还是大端?什么尺寸? ***.com/a/65508621/532647 最不赞成的答案有一个内置的 .NET 5 助手,从这里链接以获得更多可见性 【参考方案1】:

首先,您需要将其放入byte[],所以这样做:

byte[] ba = Encoding.Default.GetBytes("sample");

然后就可以得到字符串了:

var hexString = BitConverter.ToString(ba);

现在,这将返回一个带有破折号 (-) 的字符串,因此您可以简单地使用它:

hexString = hexString.Replace("-", "");

如果你想摆脱那些。

注意:如果需要,您可以使用不同的 Encoding

【讨论】:

使用默认编码在任何情况下都可能失败?例如在不同版本的 Windows 上运行? @jacktric 如果您知道编码,则应始终使用特定编码。但是,我使用 Default 编码已有十多年了,并且在跨地理位置或 Windows 版本的生产中没有遇到任何问题。 如果你想让它反过来怎么办?那么从十六进制字符串的变量到只有字母数字的字符串?【参考方案2】:

对于 Unicode 支持:

public class HexadecimalEncoding

    public static string ToHexString(string str)
    
        var sb = new StringBuilder();

        var bytes = Encoding.Unicode.GetBytes(str);
        foreach (var t in bytes)
        
            sb.Append(t.ToString("X2"));
        

        return sb.ToString(); // returns: "48656C6C6F20776F726C64" for "Hello world"
    

    public static string FromHexString(string hexString)
    
        var bytes = new byte[hexString.Length / 2];
        for (var i = 0; i < bytes.Length; i++)
        
            bytes[i] = Convert.ToByte(hexString.Substring(i * 2, 2), 16);
        

        return Encoding.Unicode.GetString(bytes); // returns: "Hello world" for "48656C6C6F20776F726C64"
    

【讨论】:

最好使用两个Extension Methods 【参考方案3】:
var result = string.Join("", input.Select(c => ((int)c).ToString("X2")));

var result  =string.Join("", 
                input.Select(c=> String.Format("0:X2", Convert.ToInt32(c))));

【讨论】:

您可以将其简化为((int)c).ToString("X") 实际上,我意识到这对于任何 ≤ 0x0F 的字符都是错误的,因为缺少零填充。要解决这个问题,请使用ToString("X2") 第一个在 dot42 上为我工作,处理 4096 字节大约需要 10 秒,但我需要它来进行调试,它与只是挂起的 BitConverter 不同。 +1【参考方案4】:

在 .NET 5.0 及更高版本中,您可以使用Convert.ToHexString() 方法。

using System;
using System.Text;

string value = "Hello world";

byte[] bytes = Encoding.UTF8.GetBytes(value);

string hexString = Convert.ToHexString(bytes);

Console.WriteLine($"String value: \"value\"");
Console.WriteLine($"   Hex value: \"hexString\"");

运行上面的示例代码,你会得到以下输出:

String value: "Hello world"
   Hex value: "48656C6C6F20776F726C64"

【讨论】:

很好的答案,我不知道.NET 终于包含了一种将字符串转换为十六进制的内置方法! (不仅仅是 Base64!)谢谢!【参考方案5】:

根据这个sn-p here,这种方法应该适合长字符串:

private string StringToHex(string hexstring)

    StringBuilder sb = new StringBuilder();
    foreach (char t in hexstring)
     
        //Note: X for upper, x for lower case letters
        sb.Append(Convert.ToInt32(t).ToString("x")); 
    
    return sb.ToString();

用法:

string result = StringToHex("Hello world"); //returns "48656c6c6f20776f726c64"

一行中的另一种方法

string input = "Hello world";
string result = String.Concat(input.Select(x => ((int)x).ToString("x")));

【讨论】:

【参考方案6】:

很少有 Unicode 替代品

var s = "0?????";

var s1 = string.Concat(s.Select(c => $"(int)c:x4"));  // left padded with 0 - "0030d835dfcfd835dfdad835dfe5d835dff0d835dffb"

var sL = BitConverter.ToString(Encoding.Unicode.GetBytes(s)).Replace("-", "");       // Little Endian "300035D8CFDF35D8DADF35D8E5DF35D8F0DF35D8FBDF"
var sB = BitConverter.ToString(Encoding.BigEndianUnicode.GetBytes(s)).Replace("-", ""); // Big Endian "0030D835DFCFD835DFDAD835DFE5D835DFF0D835DFFB"

// no encodding "300035D8CFDF35D8DADF35D8E5DF35D8F0DF35D8FBDF"
byte[] b = new byte[s.Length * sizeof(char)];
Buffer.BlockCopy(s.ToCharArray(), 0, b, 0, b.Length);
var sb = BitConverter.ToString(b).Replace("-", "");

【讨论】:

【参考方案7】:

要交换字节顺序反转数组

var bcd = new byte[]  64, 7, 19, 0, 0, 0 ;
var str = String.Join("", bcd.Reverse().Select(b => $"b:X2"));

str => 000000317004

为了还交换每个字节的 4 位半字节,移位和掩码以分别格式化每个 4 位。

var bcd = new byte[]  64, 7, 19, 0, 0, 0 ;
var str = String.Join("", bcd.Reverse().Select(b => $"b & 0x0F:X1b>>4:X1"));

str => 000000130740

【讨论】:

以上是关于在 C# 中将字符串转换为十六进制字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将十六进制值从 SQL Server 转换为日期时间

如何在 C# 中将 E+ 数字从字符串转换为十进制? [复制]

在c#中将十进制值转换为两个精度[重复]

如何在c#中将字符串“2.000,65”转换为十进制2,000.65(en-Us)文化[关闭]

在python中将字节转换为位

在 C# 中将字符串散列到颜色