Lookup

  • Text: 23,879.41 (20.8X faster)
  • Sentence: 1.15 (23.9X faster)
/// <summary>
/// Hex string lookup table.
/// </summary>
private static readonly string[] HexStringTable = new string[]
{
"", "", "", "", "", "", "", "", "", "", "0A", "0B", "0C", "0D", "0E", "0F",
"", "", "", "", "", "", "", "", "", "", "1A", "1B", "1C", "1D", "1E", "1F",
"", "", "", "", "", "", "", "", "", "", "2A", "2B", "2C", "2D", "2E", "2F",
"", "", "", "", "", "", "", "", "", "", "3A", "3B", "3C", "3D", "3E", "3F",
"", "", "", "", "", "", "", "", "", "", "4A", "4B", "4C", "4D", "4E", "4F",
"", "", "", "", "", "", "", "", "", "", "5A", "5B", "5C", "5D", "5E", "5F",
"", "", "", "", "", "", "", "", "", "", "6A", "6B", "6C", "6D", "6E", "6F",
"", "", "", "", "", "", "", "", "", "", "7A", "7B", "7C", "7D", "7E", "7F",
"", "", "", "", "", "", "", "", "", "", "8A", "8B", "8C", "8D", "8E", "8F",
"", "", "", "", "", "", "", "", "", "", "9A", "9B", "9C", "9D", "9E", "9F",
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "AA", "AB", "AC", "AD", "AE", "AF",
"B0", "B1", "B2", "B3", "B4", "B5", "B6", "B7", "B8", "B9", "BA", "BB", "BC", "BD", "BE", "BF",
"C0", "C1", "C2", "C3", "C4", "C5", "C6", "C7", "C8", "C9", "CA", "CB", "CC", "CD", "CE", "CF",
"D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "D8", "D9", "DA", "DB", "DC", "DD", "DE", "DF",
"E0", "E1", "E2", "E3", "E4", "E5", "E6", "E7", "E8", "E9", "EA", "EB", "EC", "ED", "EE", "EF",
"F0", "F1", "F2", "F3", "F4", "F5", "F6", "F7", "F8", "F9", "FA", "FB", "FC", "FD", "FE", "FF"
}; /// <summary>
/// Returns a hex string representation of an array of bytes.
/// </summary>
/// <param name="value">The array of bytes.</param>
/// <returns>A hex string representation of the array of bytes.</returns>
public static string ToHex(this byte[] value)
{
StringBuilder stringBuilder = new StringBuilder();
if (value != null)
{
foreach (byte b in value)
{
stringBuilder.Append(HexStringTable[b]);
}
} return stringBuilder.ToString();
}

The above approach runs 25% faster than using a small hex alphabet and doing something like:

  • Text: 23,201.23 (21.4X faster)
  • Sentence: 1.24 (22.3X faster)
StringBuilder stringBuilder = new StringBuilder();
string hexAlphabet = "0123456789ABCDEF";
if (value != null)
{
foreach (byte b in value)
{
stringBuilder.Append(hexAlphabet[(int)(b >> )]);
stringBuilder.Append(hexAlphabet[(int)(b & 0xF)]);
}
}

BitConverter

  • Text: 113,269.34 (4.4X faster)
  • Sentence: 9.98 (2.8X faster)
public static string ByteArrayToString(byte[] ba)
{
string hex = BitConverter.ToString(ba);
return hex.Replace("-","");
}

StringBulider.AppendFormat

  • Text: 672,115.77 (1.1X faster)
  • Sentence: 36.82 (1.1X faster)
public static string ByteArrayToString(byte[] ba)
{
StringBuilder hex = new StringBuilder(ba.Length * );
foreach (byte b in ba)
hex.AppendFormat("{0:x2}", b);
return hex.ToString();
}
  • Text: 718,380.63 (1.0X faster)
  • Sentence: 39.71 (1.0X faster)
        static string ByteArrayToHexStringViaStringBuilderAggregateAppendFormat(byte[] bytes)
{
return bytes.Aggregate(new StringBuilder(bytes.Length * ), (sb, b) => sb.AppendFormat("{0:X2}", b)).ToString();
}

Array.ConvertAll

  • Text: 752,078.70 (1.0X faster)
  • Sentence: 18.28 (2.2X faster)
        static string ByteArrayToHexStringViaStringConcatArrayConvertAll(byte[] bytes)
{
return string.Concat(Array.ConvertAll(bytes, b => b.ToString("X2")));
}
  • Text: 675,451.57 (1.1X faster)
  • Sentence: 17.95 (2.2X faster)
        static string ByteArrayToHexStringViaStringJoinArrayConvertAll(byte[] bytes)
{
return string.Join(string.Empty, Array.ConvertAll(bytes, b => b.ToString("X2")));
}

{byte}.ToString("x2")

  • Text: 308,805.38 (2.4X faster)
  • Sentence: 16.89 (2.4X faster)
        static string ByteArrayToHexStringViaStringBuilderForEachByteToString(byte[] bytes)
{
StringBuilder hex = new StringBuilder(bytes.Length * );
foreach (byte b in bytes)
hex.Append(b.ToString("X2"));
return hex.ToString();
}
  • Text: 352,828.20 (2.1X faster)
  • Sentence: 16.87 (2.4X faster)
        static string ByteArrayToHexStringViaStringBuilderAggregateByteToString(byte[] bytes)
{
return bytes.Aggregate(new StringBuilder(bytes.Length * ), (sb, b) => sb.Append(b.ToString("X2"))).ToString();
}

{SoapHexBinary}.ToString()

        static string ByteArrayToHexViaSoapHexBinary(byte[] bytes)
{
SoapHexBinary soapHexBinary = new SoapHexBinary(bytes);
return soapHexBinary.ToString();
}

Byte Manipulation

  • Text: 16,856.64 (29.5X faster)
  • Sentence: 0.70 (39.5X faster)
        static string ByteArrayToHexViaByteManipulation(byte[] bytes)
{
char[] c = new char[bytes.Length * ];
byte b;
for (int i = ; i < bytes.Length; i++)
{
b = ((byte)(bytes[i] >> ));
c[i * ] = (char)(b > ? b + 0x37 : b + 0x30);
b = ((byte)(bytes[i] & 0xF));
c[i * + ] = (char)(b > ? b + 0x37 : b + 0x30);
}
return new string(c);
}
  • Text: 12,967.69 (38.4X faster)
  • Sentence: 0.73 (37.9X faster)
        static string ByteArrayToHexViaByteManipulation2(byte[] bytes)
{
char[] c = new char[bytes.Length * ];
int b;
for (int i = ; i < bytes.Length; i++)
{
b = bytes[i] >> ;
c[i * ] = (char)( + b + (((b - ) >> ) & -));
b = bytes[i] & 0xF;
c[i * + ] = (char)( + b + (((b - ) >> ) & -));
}
return new string(c);
}

Lookup by byte

  • Text: 10,853.96 (45.8X faster)
  • Sentence: 0.65 (42.7X faster)
private static readonly uint[] _lookup32 = CreateLookup32();

private static uint[] CreateLookup32()
{
var result = new uint[];
for (int i = ; i < ; i++)
{
string s=i.ToString("X2");
result[i] = ((uint)s[]) + ((uint)s[] << );
}
return result;
} private static string ByteArrayToHexViaLookup32(byte[] bytes)
{
var lookup32 = _lookup32;
var result = new char[bytes.Length * ];
for (int i = ; i < bytes.Length; i++)
{
var val = lookup32[bytes[i]];
result[*i] = (char)val;
result[*i + ] = (char) (val >> );
}
return new string(result);
}

Lookup by byte unsafe

private static readonly uint[] _lookup32Unsafe = CreateLookup32Unsafe();
private static readonly uint* _lookup32UnsafeP = (uint*)GCHandle.Alloc(_lookup32Unsafe,GCHandleType.Pinned).AddrOfPinnedObject(); private static uint[] CreateLookup32Unsafe()
{
var result = new uint[];
for (int i = ; i < ; i++)
{
string s=i.ToString("X2");
if(BitConverter.IsLittleEndian)
result[i] = ((uint)s[]) + ((uint)s[] << );
else
result[i] = ((uint)s[]) + ((uint)s[] << );
}
return result;
} public static string ByteArrayToHexViaLookup32Unsafe(byte[] bytes)
{
var lookupP = _lookup32UnsafeP;
var result = new char[bytes.Length * ];
fixed(byte* bytesP = bytes)
fixed (char* resultP = result)
{
uint* resultP2 = (uint*)resultP;
for (int i = ; i < bytes.Length; i++)
{
resultP2[i] = lookupP[bytesP[i]];
}
}
return new string(result);
}

Or if you consider it acceptable to write into the string directly:

public static string ByteArrayToHexViaLookup32UnsafeDirect(byte[] bytes)
{
var lookupP = _lookup32UnsafeP;
var result = new string((char), bytes.Length * );
fixed (byte* bytesP = bytes)
fixed (char* resultP = result)
{
uint* resultP2 = (uint*)resultP;
for (int i = ; i < bytes.Length; i++)
{
resultP2[i] = lookupP[bytesP[i]];
}
}
return result;
}

Quote From

How do you convert Byte Array to Hexadecimal String, and vice versa

byte[] to hex string

blambert/codesnip – Fast byte array to hex string conversion

Byte Array to Hexadecimal String的更多相关文章

  1. Convert a byte[] array to readable string format. This makes the "hex" readable!

    /* * Java Bittorrent API as its name indicates is a JAVA API that implements the Bittorrent Protocol ...

  2. C# byte array 跟 string 互转

    用 System.Text.Encoding.Default.GetString() 转换时,byte array 中大于 127 的数据转 string 时会出问题. 把这里的 Default 换成 ...

  3. C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:

    public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...

  4. C# byte[]与char[]、string与char[]、byte[] 与 string 互转

    1. byte array -> char array Byte[] b=new byte[5]{0x01,0x02,0x03,0x04,0x05};  Char[] c=Encoding.AS ...

  5. Java中如何正确的将byte[]数组转化为String类型?

    很多人在编程时,总是喜欢用一下方法将数组转为字符串:(a为byte数组) String s=a.toString(); 可是每次返回的时候,新手看来返回的结果是乱码,比如说我,写RSA算法时,没有注意 ...

  6. PHP write byte array to file

    /********************************************************************************* * PHP write byte ...

  7. perl malformed JSON string, neither tag, array, object, number, string or atom, at character offset

    [root@wx03 ~]# cat a17.pl use JSON qw/encode_json decode_json/ ; use Encode; my $data = [ { 'name' = ...

  8. Java之byte、char和String类型相互转换

    package basictype; /** * byte.char和String类型相互转换 */ public class CHJavaType { public static void main ...

  9. How to convert a byte to its binary string representation

    How to convert a byte to its binary string representation For example, the bits in a byte B are 1000 ...

随机推荐

  1. Linux centOS本地DNS安装

    centOS本地DNS安装 在centOS里最常用的DNS服务工具应该是bind了.下面就以bind为例做一个DNS服务. 首先查看bind 是否已经安装 Rpm -qa | gerp bind 如果 ...

  2. 公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享

    公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享 在这个文章里面我将用一个实际的案例来分享如何来构建一个能够接受3000+个连接的GPRS通讯服务器软件,这个软件被我认为是一个艺术品,实现周期为 ...

  3. [置顶] javascript-基于对象or面向对象?

    最近完成了javascript的初级学习,在这个学习的视频中,我特别注意了两个词,解释性语言和对象,javascript按照我的理解,应该是种解释性语言,他有关于面向对象的思想的体现,但是,他和vb一 ...

  4. hadoop部署错误

    hadoop的单机部署很简单也不容易出错,但是对生产环境的价值和意义不大,但是可以快速用于开发. 部署hadoop的错误原因不少,并且很奇怪. 比如,用户名不同,造成客户端和服务器通讯产生认证失败的错 ...

  5. Nodejs应用安全备忘录

    本人新博客www.wjs.photo,基于360的firekylin,感兴趣的可以看看哈 本文翻译自 www.risingstack.com ,并非逐字逐句的翻译,有错误的地方请指出,谢谢啦 应用程序 ...

  6. 论移动端Hybid开发

    以下内容code地址:https://github.com/wytings/Hybrid 背景:公司业务的发展和开发需求升级,我们需要Hybrid了.市面上有很多开源的Hybrid框架给我们直接使用, ...

  7. 结构-行为-样式-Css笔记

     0.常见的行级元素和块级元素: 行级元素:div,table,form ,ul,ol,p,h1-h6,hr; 块级元素:a,select,input,textarea,img,label,br,i, ...

  8. Java的常用包

    java.lang:  这个包下包含了Java语言的核心类,如String.Math.Sytem和Thread类等,使用这个包无需使用import语句导入,系统会自动导入这个包中的所有类. java. ...

  9. Finding Lines

    Finding Lines 题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8& ...

  10. python-微博模拟登陆

    微博的的模拟登陆是比较坑的,看了网上很多大神的帖子,自己又看了微博的登陆时的json数据:1.发现登陆时在输入账号时用chrome可以看到会有一个prelogin之类的网址,网址后面会有大串的随机数. ...