如何做到 byte[] 和 十六进制 互转?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何做到 byte[] 和 十六进制 互转?相关的知识,希望对你有一定的参考价值。

咨询区

  • alextansc

请问我如何实现将 byte[] 和 十六进制的string 进行互转?

回答区

  • balrob

如果你的程序是基于 .NET5 的,可以使用 Convert 下新增的两个方法 ToHexStringFromHexString ,参考下面两个方法的定义。

//
// Summary:
//     Converts an array of 8-bit unsigned integers to its equivalent string representation
//     that is encoded with uppercase hex characters.
//
// Parameters:
//   inArray:
//     An array of 8-bit unsigned integers.
//
// Returns:
//     The string representation in hex of the elements in inArray.
//
// Exceptions:
//   T:System.ArgumentNullException:
//     inArray is null.
//
//   T:System.ArgumentOutOfRangeException:
//     inArray is too large to be encoded.
public static string ToHexString(byte[] inArray);


//
// Summary:
//     Converts the specified string, which encodes binary data as hex characters, to
//     an equivalent 8-bit unsigned integer array.
//
// Parameters:
//   s:
//     The string to convert.
//
// Returns:
//     An array of 8-bit unsigned integers that is equivalent to s.
//
// Exceptions:
//   T:System.ArgumentNullException:
//     s is null.
//
//   T:System.FormatException:
//     The length of s, is not zero or a multiple of 2.
//
//   T:System.FormatException:
//     The format of s is invalid. s contains a non-hex character.
public static byte[] FromHexString(string s);
  • Mykroft

在 W3cXsd2001 命名空间下有一个可以实现 byte[] 到 hex 之间的转换方法,我觉得可以满足你的需求,参考如下:

using System.Runtime.Remoting.Metadata.W3cXsd2001;

public static byte[] GetStringToBytes(string value)
{
    SoapHexBinary shb = SoapHexBinary.Parse(value);
    return shb.Value;
}

public static string GetBytesToString(byte[] value)
{
    SoapHexBinary shb = new SoapHexBinary(value);
    return shb.ToString();
}
  • Waleed Eissa

我最近刚好也遇到了这个问题,我是这么解决的。

byte[] bytes = {0, 1, 2, 4, 8, 16, 32, 64, 128, 256}
Console.WriteLine( BitConverter.ToString(bytes));

但用它性能会比较慢,所以基于它我做了一个版本优化,性能是它的8倍以上,参考如下:

private static string ByteArrayToHex(byte[] barray)
{
    char[] c = new char[barray.Length * 2];
    byte b;
    for (int i = 0; i < barray.Length; ++i)
    {
        b = ((byte)(barray[i] >> 4));
        c[i * 2] = (char)(b > 9 ? b + 0x37 : b + 0x30);
        b = ((byte)(barray[i] & 0xF));
        c[i * 2 + 1] = (char)(b > 9 ? b + 0x37 : b + 0x30);
    }
    return new string(c);
}

点评区

没想到 .NET5 中已经有了 FromHexString,ToHexString 方法, Convert 类越来越强大了,工作效率看样子又可以提高了。

以上是关于如何做到 byte[] 和 十六进制 互转?的主要内容,如果未能解决你的问题,请参考以下文章

java中byte[] 和16进制字符串互转

JAVA里16进制和字节数组互转

Java File ,byte[] , 二进制字符串之间互转

最全面的Java字节byte操作,处理Java基本数据的转换及进制转换操作工具,流媒体及java底层开发项目常用工具类

进制之间互转

使用Apache的Hex类实现Hex(16进制字符串和)和字节数组的互转