簡體   English   中英

在 C# 中將字符串轉換為十六進制字符串

[英]Convert string to hex-string in C#

我有一個像“sample”這樣的字符串。 我想得到一個十六進制格式的字符串; 像這樣:

"796173767265"

請給出 C# 語法。

首先你需要把它變成一個byte[] ,所以這樣做:

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

然后你可以得到字符串:

var hexString = BitConverter.ToString(ba);

現在,這將返回一個帶有破折號( - )的字符串,因此您可以簡單地使用它:

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

如果你想擺脫那些。

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

在 .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"

對於 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"
    }
}
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))));

根據這里的代碼片段,這種方法應該適用於長字符串:

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("x2")); 
    }
    return sb.ToString();
}

用法:

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

一行中的另一種方法

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

很少有 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("-", "");

如果需要對字節或字的字節序進行詳細轉換,這里是一個進行按位轉換的工藝示例。

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:X1}{b>>4:X1}"));

str => 000000130740

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM