Byte Array to Hexadecimal String
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的更多相关文章
- 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 ...
- C# byte array 跟 string 互转
用 System.Text.Encoding.Default.GetString() 转换时,byte array 中大于 127 的数据转 string 时会出问题. 把这里的 Default 换成 ...
- C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:
public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...
- 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 ...
- Java中如何正确的将byte[]数组转化为String类型?
很多人在编程时,总是喜欢用一下方法将数组转为字符串:(a为byte数组) String s=a.toString(); 可是每次返回的时候,新手看来返回的结果是乱码,比如说我,写RSA算法时,没有注意 ...
- PHP write byte array to file
/********************************************************************************* * PHP write byte ...
- 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' = ...
- Java之byte、char和String类型相互转换
package basictype; /** * byte.char和String类型相互转换 */ public class CHJavaType { public static void main ...
- 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 ...
随机推荐
- MS Sql Server 消除重复行 保留信息完整的一条 2011-11-26 13:19(QQ空间)
select company ,count(company) as coun into myls from mylist group by company having count(company)& ...
- Spring注解用法
1. Controller层:@Controller @Controller @RequestMapping("/user")//请求localhost:8080/user/*** ...
- zoj 1610 Count the Colors(线段树延迟更新)
所谓的懒操作模板题. 学好acm,英语很重要.做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意.最后确定了是线段树延迟更新果题.我就欣欣然上手敲了出来. 然后是漫长的段错误.... 第一次 ...
- Android数据存储汇总
1.sharedpreference,存储简单的信息,比如用户名,密码 package com.google.datastore.sharep; import android.app.Activity ...
- Web基础知识和技术
WEB是一个外延广泛的概念,不单单指网站,乌徒帮专注拥有WEB界面的网站开发,帮助初学者或已经进入开发的朋友们提供参考讨论平台,然而并不一定能将所有的WEB知识讲全讲透,只是能满足初涉者的建站需求,能 ...
- 微信--高效解决token及授权用户openid的持久化处理办法
摘要 关于微信开发的话题,例子确实已经有不少,但大部分都是人云亦云,很多小细节或者需要注意的地方却大多没有讲清楚,这令很多刚开始开发的人感觉大很迷茫.而我今天要说的话题,主要着眼于两个方面. 一:如 ...
- java 线程池简介
线程池简介 通过前面的章节我们了解到如何去创建线程,但是如果我们每一次多去创建线程.我们是否回去想,既然是创建线程我们为什么不能像连接池一样呢.做到线程之间的复用呢,减少资源之间的让费呢? jdk为我 ...
- 驱动05.lcd设备驱动程序
参考s3c2410fb.c总结出框架 1.代码分析 1.1 入口函数 int __devinit s3c2410fb_init(void) { return platform_driver_regis ...
- Threejs基础学习【修改版】
一. Three.js官网及使用Three.js必备的三个条件 1.Three.js 官网 https://threejs.org/ 2.使用Three.js必备的三个条件(To actually b ...
- 获取select选中的值
$("#CalibrationYear option:selected").text();