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 ...
随机推荐
- JavaEE:response响应和request请求
Web服务器接收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象既然代表请求和响应,那么我 ...
- 关于Update语句的锁
关于Update语句的锁 环境:MSSQL2005,在Read Committed级别 语句A:begin tranUpdate Table Set f1='xxx' where f2='ttt' ...
- 10169 - Urn-ball Probabilities !
描述:有两个罐子,一个罐子里有一个红球,另一个罐子里有一个红球和一个白球,每次从两个罐子里各取一个球,然后在向每个罐子里各加一个白球,一次取到两个红球时就结束取球,求n次取球中至少一次为取球为红球的概 ...
- Servlet部署描述文件(web.xml)
最近看了下配置文件(Deployment Descriptor:简称DD),又称部署描述文件,下面详细介绍下该文件的组成和作用: 一.<web-app>有四个属性: 1.xmlns:申明了 ...
- 64位linux报错Could not initialize class java.awt.image.BufferedImage
最近碰到一个问题: 64位linux报错Could not initialize class java.awt.image.BufferedImage 在WIN平台下运行正常BufferedImage ...
- Excel单元格所在的行和列变色
网友问到如何通过移动光标选择单元格,所在的行和列变色.如每次输入价格的时候,想想在横竖方向上有颜色标识,这样方便对照输入价格 . 这里可以使用窗体的Worksheet_SelectionChange ...
- 0116MySql主从复制监控
如何自动化监控mysql主从服务-- 第一步创建目录mkdir -p /tmp/mysql/masterslave #日志存放目录在/root下面创建sh目录 #存放执行的SHELL脚本 -- 第二步 ...
- CodeForces 718C Sasha and Array
线段树. 线段树维护区间矩阵和,操作都是最简单的线段树.$lazy$标记不要记录乘了几次,直接记录乘了几次之后的矩阵就可以了,不然每次下传的时候再算一遍时间复杂度会提高. #pragma commen ...
- Linux环境快速搭建RocketMQ双Master模式
RocketMQ的集群部署方式有多种,其中包括单个Master.多个Master.多Master多Slave模式(异步复制)以及多Master多Slave模式(同步双写).本次以多Master集群模式 ...
- CAD打开缓慢问题解决方法
打开AutoCAD很卡,大概需要1分钟 打开Internet Explorer,点击工具菜单,打开"Internet选项",去勾选"检查发行商的证书是否吊销", ...