byte[]
をstring
に変換するにはどうすればいいですか?私はそれを試みるたびに、私は得る
System.Byte []
値の代わりに。
また、10進数ではなく16進数で値を取得する方法
これには組み込みメソッドがあります。
byte[] data = { 1, 2, 4, 8, 16, 32 };
string hex = BitConverter.ToString(data);
結果:01-02-04-08-10-20
ダッシュなしで使いたい場合は、それらを削除してください。
string hex = BitConverter.ToString(data).Replace("-", string.Empty);
結果:010204081020
よりコンパクトな表現が必要な場合は、Base64を使用できます。
string base64 = Convert.ToBase64String(data);
結果:AQIECBAg
私はそれの地獄のためにここにリストされた方法の各々のスピードを比較しようとするだろうと思いました。 これをスピードテストのコードに基づいています。
その結果、BitConverter + String.Replaceは他のほとんどの単純な方法よりも速いようです。しかし、速度は Nathan MoinvaziriのByteArrayToHexString やKurtのToHexのようなアルゴリズムで改善できます。
また、string.Concatとstring.Joinが長い文字列に対するStringBuilderの実装よりもはるかに遅いのですが、短い配列に対しても同様であることも興味深いことです。おそらく、長い文字列でStringBuilderを拡張しているため、初期サイズを設定するとこの違いがなくなるはずです。
あり:
LONG_STRING_LENGTH = 1000 * 1024;
- BitConvertRep計算経過時間27,202ミリ秒(最速内蔵/単純)
- StringBuilder計算時間経過75,723ミリ秒(StringBuilder再割り当てなし)
- LinqConcat計算時間の経過182,094ミリ秒
- LinqJoin計算時間の経過181,142ミリ秒
- LinqAgg計算時間の経過93,087ミリ秒(StringBuilderと再割り当て)
- ToHex計算経過時間19,167 ms(最速)
With:
LONG_STRING_LENGTH = 100 * 1024;
、類似結果
- BitConvertReplaceの計算時間経過時間3431ミリ秒
- StringBuilder計算時間経過8289ミリ秒
- LinqConcat計算時間の経過21512ミリ秒
- LinqJoin計算時間経過19433ミリ秒
- LinqAggの計算時間経過9230ミリ秒
- ToHex計算時間経過1976ミリ秒
int MANY_STRING_COUNT = 1000;
int MANY_STRING_LENGTH = 1024;
(最初のテストと同じバイト数ですが、異なる配列にあります)
- BitConvertReplaceの計算時間経過時間25,680ミリ秒
- StringBuilder計算時間経過78,411ミリ秒
- LinqConcat計算時間経過101,233ミリ秒
- LinqJoin計算時間経過99,311ミリ秒
- LinqAgg計算時間の経過84,660ミリ秒
- ToHex計算時間の経過18,221ミリ秒
あり:
int MANY_STRING_COUNT = 2000;
int MANY_STRING_LENGTH = 20;
- BitConvertReplaceの計算時間経過1347ミリ秒
- StringBuilder計算経過時間3234ミリ秒
- LinqConcat計算時間の経過5013ミリ秒
- LinqJoin計算時間の経過4826ミリ秒
- LinqAggの計算時間経過3589ミリ秒
- ToHex計算時間経過772ミリ秒
私が使用したテストコード:
void Main()
{
int LONG_STRING_LENGTH = 100 * 1024;
int MANY_STRING_COUNT = 1024;
int MANY_STRING_LENGTH = 100;
var source = GetRandomBytes(LONG_STRING_LENGTH);
List<byte[]> manyString = new List<byte[]>(MANY_STRING_COUNT);
for (int i = 0; i < MANY_STRING_COUNT; ++i)
{
manyString.Add(GetRandomBytes(MANY_STRING_LENGTH));
}
var algorithms = new Dictionary<string,Func<byte[], string>>();
algorithms["BitConvertReplace"] = BitConv;
algorithms["StringBuilder"] = StringBuilderTest;
algorithms["LinqConcat"] = LinqConcat;
algorithms["LinqJoin"] = LinqJoin;
algorithms["LinqAgg"] = LinqAgg;
algorithms["ToHex"] = ToHex;
algorithms["ByteArrayToHexString"] = ByteArrayToHexString;
Console.WriteLine(" === Long string test");
foreach (var pair in algorithms) {
TimeAction(pair.Key + " calculation", 500, () =>
{
pair.Value(source);
});
}
Console.WriteLine(" === Many string test");
foreach (var pair in algorithms) {
TimeAction(pair.Key + " calculation", 500, () =>
{
foreach (var str in manyString)
{
pair.Value(str);
}
});
}
}
// Define other methods and classes here
static void TimeAction(string description, int iterations, Action func) {
var watch = new Stopwatch();
watch.Start();
for (int i = 0; i < iterations; i++) {
func();
}
watch.Stop();
Console.Write(description);
Console.WriteLine(" Time Elapsed {0} ms", watch.ElapsedMilliseconds);
}
//static byte[] GetRandomBytes(int count) {
// var bytes = new byte[count];
// (new Random()).NextBytes(bytes);
// return bytes;
//}
static Random Rand = new Random();
static byte[] GetRandomBytes(int count) {
var bytes = new byte[count];
Rand.NextBytes(bytes);
return bytes;
}
static string BitConv(byte[] data)
{
return BitConverter.ToString(data).Replace("-", string.Empty);
}
static string StringBuilderTest(byte[] data)
{
StringBuilder sb = new StringBuilder(data.Length*2);
foreach (byte b in data)
sb.Append(b.ToString("X2"));
return sb.ToString();
}
static string LinqConcat(byte[] data)
{
return string.Concat(data.Select(b => b.ToString("X2")).ToArray());
}
static string LinqJoin(byte[] data)
{
return string.Join("",
data.Select(
bin => bin.ToString("X2")
).ToArray());
}
static string LinqAgg(byte[] data)
{
return data.Aggregate(new StringBuilder(),
(sb,v)=>sb.Append(v.ToString("X2"))
).ToString();
}
static string ToHex(byte[] bytes)
{
char[] c = new char[bytes.Length * 2];
byte b;
for(int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)
{
b = ((byte)(bytes[bx] >> 4));
c[cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0');
b = ((byte)(bytes[bx] & 0x0F));
c[++cx] = (char)(b > 9 ? b - 10 + 'A' : b + '0');
}
return new string(c);
}
public static string ByteArrayToHexString(byte[] Bytes)
{
StringBuilder Result = new StringBuilder(Bytes.Length*2);
string HexAlphabet = "0123456789ABCDEF";
foreach (byte B in Bytes)
{
Result.Append(HexAlphabet[(int)(B >> 4)]);
Result.Append(HexAlphabet[(int)(B & 0xF)]);
}
return Result.ToString();
}
同様のプロセス を持つ別の回答でも、まだ結果を比較していません。
Hex、Linq-fu:
string.Concat(ba.Select(b => b.ToString("X2")).ToArray())
時刻付きの更新
@RubenBartelinkで述べたように、IEnumerable<string>
から配列への変換を持たないコード:ba.Select(b => b.ToString("X2"))
は4.0より前では動作しませんでしたが、同じコードが4.0で動作するようになりました。
このコード...
byte[] ba = { 1, 2, 4, 8, 16, 32 };
string s = string.Concat(ba.Select(b => b.ToString("X2")));
string t = string.Concat(ba.Select(b => b.ToString("X2")).ToArray());
Console.WriteLine (s);
Console.WriteLine (t);
.... NET 4.0より前の出力は次のとおりです。
System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.Byte,System.String]
010204081020
.NET 4.0以降では、string.ConcatにはIEnumerableを受け入れるオーバーロードがあります。したがって、4.0では、上記のコードは変数sとtの両方に対して同じ出力を持ちます。
010204081020
010204081020
4.0より前では、ba.Select(b => b.ToString("X2"))
はオーバーロード(object arg0)
になります。IEnumerable<string>
が適切なオーバーロード、つまり(params string[] values)
に移動する方法は、IEnumerable<string>
から文字列配列へ。 4.0より前のstring.Concatには10個のオーバーロード関数がありましたが、4.0では12個になりました
これは別の方法です:
public static string ByteArrayToHexString(byte[] Bytes)
{
StringBuilder Result = new StringBuilder(Bytes.Length * 2);
string HexAlphabet = "0123456789ABCDEF";
foreach (byte B in Bytes)
{
Result.Append(HexAlphabet[(int)(B >> 4)]);
Result.Append(HexAlphabet[(int)(B & 0xF)]);
}
return Result.ToString();
}
public static byte[] HexStringToByteArray(string Hex)
{
byte[] Bytes = new byte[Hex.Length / 2];
int[] HexValue = new int[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
0x06, 0x07, 0x08, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F };
for (int x = 0, i = 0; i < Hex.Length; i += 2, x += 1)
{
Bytes[x] = (byte)(HexValue[Char.ToUpper(Hex[i + 0]) - '0'] << 4 |
HexValue[Char.ToUpper(Hex[i + 1]) - '0']);
}
return Bytes;
}
あるいは、変換テーブルをそのように事前に構築して、さらに速い結果を達成することもできます。
よく私はバイトを16進数に変換しないので、これより良い方法があるかどうかわからないと言わなければなりませんが、ここでそれを行う方法です。
StringBuilder sb = new StringBuilder();
foreach (byte b in myByteArray)
sb.Append(b.ToString("X2"));
string hexString = sb.ToString();
たとえそれらが標準ライブラリメソッドをラップしているとしても、私はこのような変換に拡張メソッドを使うのが好きです。 16進数変換の場合、私は以下の手動で調整された(すなわち、fast)アルゴリズムを使用します。
public static string ToHex(this byte[] bytes)
{
char[] c = new char[bytes.Length * 2];
byte b;
for(int bx = 0, cx = 0; bx < bytes.Length; ++bx, ++cx)
{
b = ((byte)(bytes[bx] >> 4));
c[cx] = (char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
b = ((byte)(bytes[bx] & 0x0F));
c[++cx]=(char)(b > 9 ? b + 0x37 + 0x20 : b + 0x30);
}
return new string(c);
}
public static byte[] HexToBytes(this string str)
{
if (str.Length == 0 || str.Length % 2 != 0)
return new byte[0];
byte[] buffer = new byte[str.Length / 2];
char c;
for (int bx = 0, sx = 0; bx < buffer.Length; ++bx, ++sx)
{
// Convert first half of byte
c = str[sx];
buffer[bx] = (byte)((c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0')) << 4);
// Convert second half of byte
c = str[++sx];
buffer[bx] |= (byte)(c > '9' ? (c > 'Z' ? (c - 'a' + 10) : (c - 'A' + 10)) : (c - '0'));
}
return buffer;
}
答えを出すべきだと思った。私のテストでは、この方法が最速です。
public static class Helper
{
public static string[] HexTbl = Enumerable.Range(0, 256).Select(v => v.ToString("X2")).ToArray();
public static string ToHex(this IEnumerable<byte> array)
{
StringBuilder s = new StringBuilder();
foreach (var v in array)
s.Append(HexTbl[v]);
return s.ToString();
}
public static string ToHex(this byte[] array)
{
StringBuilder s = new StringBuilder(array.Length*2);
foreach (var v in array)
s.Append(HexTbl[v]);
return s.ToString();
}
}
非常に高速な拡張方法(反転あり):
public static class ExtensionMethods {
public static string ToHex(this byte[] data) {
return ToHex(data, "");
}
public static string ToHex(this byte[] data, string prefix) {
char[] lookup = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
int i = 0, p = prefix.Length, l = data.Length;
char[] c = new char[l * 2 + p];
byte d;
for(; i < p; ++i) c[i] = prefix[i];
i = -1;
--l;
--p;
while(i < l) {
d = data[++i];
c[++p] = lookup[d >> 4];
c[++p] = lookup[d & 0xF];
}
return new string(c, 0, c.Length);
}
public static byte[] FromHex(this string str) {
return FromHex(str, 0, 0, 0);
}
public static byte[] FromHex(this string str, int offset, int step) {
return FromHex(str, offset, step, 0);
}
public static byte[] FromHex(this string str, int offset, int step, int tail) {
byte[] b = new byte[(str.Length - offset - tail + step) / (2 + step)];
byte c1, c2;
int l = str.Length - tail;
int s = step + 1;
for(int y = 0, x = offset; x < l; ++y, x += s) {
c1 = (byte)str[x];
if(c1 > 0x60) c1 -= 0x57;
else if(c1 > 0x40) c1 -= 0x37;
else c1 -= 0x30;
c2 = (byte)str[++x];
if(c2 > 0x60) c2 -= 0x57;
else if(c2 > 0x40) c2 -= 0x37;
else c2 -= 0x30;
b[y] = (byte)((c1 << 4) + c2);
}
return b;
}
}
上記のスピードテストで他のすべてを破った。
===ロングストリングテスト
BitConvertReplace計算時間経過2415ミリ秒
StringBuilder計算時間経過5668ミリ秒
LinqConcat計算時間経過11826ミリ秒
LinqJoin計算時間経過9323ミリ秒
LinqAgg計算時間経過7444ミリ秒
ToHexTable計算時間経過1028ミリ秒
ToHexAcidzombie計算時間経過1035ミリ秒
ToHexPatrick計算経過時間814 ms
ToHexKurt計算時間経過1604ミリ秒
ByteArrayToHexStringの計算時間経過1330ミリ秒===多弦テスト
BitConvertReplace計算時間経過時間2238ミリ秒
StringBuilder計算時間経過5393ミリ秒
LinqConcat計算時間経過9043ミリ秒
LinqJoin計算時間経過9131ミリ秒
LinqAgg計算時間経過7324ミリ秒
ToHexTable計算時間経過968ミリ秒
ToHexAcidzombie計算時間経過969ミリ秒
ToHexPatrick計算経過時間956ミリ秒
ToHexKurt計算時間経過1547ミリ秒
ByteArrayToHexString計算時間経過1277ミリ秒
もう1つ答えを追加するために、私が使用したSystem.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary
クラスがあります。これは、16進数との間でバイトを変換できます。
string hex = new SoapHexBinary(bytes).ToString();
byte[] bytes = SoapHexBinary.Parse(hex).Value;
それが他の実装とどのように比較されるか(ベンチマーク)はわかりませんが、IMOは非常に単純です。特に16進数からバイト数に変換する場合は非常に簡単です。
と:
byte[] data = new byte[] { 0x01, 0x02, 0x03, 0x0D, 0x0E, 0x0F };
string hex = string.Empty;
data.ToList().ForEach(b => hex += b.ToString("x2"));
// use "X2" for uppercase hex letters
Console.WriteLine(hex);
結果:0102030d0e0f
バイトで表現された文字列のエンコーディングを知っておく必要がありますが、System.Text.UTF8Encoding.GetString(bytes)
またはSystem.Text.ASCIIEncoding.GetString(bytes)
と言うことができます。 (私はこれをメモリからやっているので、APIは正確ではないかもしれませんが、非常に近いです。)
2番目の質問に対する答えについては、この質問を参照してください。
値の代わりに "System.Byte []"という文字列が表示される理由については、ここで誰も言及していません。
オブジェクトが暗黙的にStringにキャストされると、プログラムはデフォルトでSystem.Object
から継承されたオブジェクトのpublic String ToString()
メソッドになります。
public virtual string ToString()
{
return this.GetType().ToString();
}
この変換を頻繁に行っていることがわかった場合は、単にラッパークラスを作成し、このメソッドを次のようにオーバーライドすることができます。
public override string ToString()
{
// do the processing here
// return the nicely formatted string
}
このラッパーオブジェクトを印刷するたびに、this.GetType().ToString()
からの値ではなく自分の値を取得します。
LINQと文字列メソッドを組み合わせます。
string hex = string.Join("",
bin.Select(
bin => bin.ToString("X2")
).ToArray());
これを行うためにパフォーマンスが必要かどうかはわかりませんが、ここではbyte []を16進数文字列に変換する最も速い方法を考えます。
static readonly char[] hexchar = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
public static string HexStr(byte[] data, int offset, int len, bool space = false)
{
int i = 0, k = 2;
if (space) k++;
var c = new char[len * k];
while (i < len)
{
byte d = data[offset + i];
c[i * k] = hexchar[d / 0x10];
c[i * k + 1] = hexchar[d % 0x10];
if (space && i < len - 1) c[i * k + 2] = ' ';
i++;
}
return new string(c, 0, c.Length);
}
他の人が言っているように、それはバイト配列の値の符号化に依存します。それにもかかわらず、あなたはこの種の事に非常に注意する必要があるか、またはあなたは選ばれたエンコーディングによって扱われないバイトを変換しようとするかもしれません。
Jon Skeetには、.NETのエンコーディングとUnicodeについての 良い記事 があります。おすすめの読書.
私はより速いバイト配列を文字列変換プログラムにしたと思います:
public static class HexTable
{
private static readonly string[] table = BitConverter.ToString(Enumerable.Range(0, 256).Select(x => (byte)x).ToArray()).Split('-');
public static string ToHexTable(byte[] value)
{
StringBuilder sb = new StringBuilder(2 * value.Length);
for (int i = 0; i < value.Length; i++)
sb.Append(table[value[i]]);
return sb.ToString();
}
そしてテストをセットアップしました:
static void Main(string[] args)
{
const int TEST_COUNT = 10000;
const int BUFFER_LENGTH = 100000;
Random random = new Random();
Stopwatch sw = new Stopwatch();
Stopwatch sw2 = new Stopwatch();
byte[] buffer = new byte[BUFFER_LENGTH];
random.NextBytes(buffer);
sw.Start();
for (int j = 0; j < TEST_COUNT; j++)
HexTable.ToHexTable(buffer);
sw.Stop();
sw2.Start();
for (int j = 0; j < TEST_COUNT; j++)
ToHexChar.ToHex(buffer);
sw2.Stop();
Console.WriteLine("Hex Table Elapsed Milliseconds: {0}", sw.ElapsedMilliseconds);
Console.WriteLine("ToHex Elapsed Milliseconds: {0}", sw2.ElapsedMilliseconds);
}
ToHexChar.ToHEx()メソッドは、前に示したToHex()メソッドです。
結果は以下のとおりです。
HexTable= 11808 msToHEx= 12168ms
それほど違いはないかもしれませんが、それでもまだ速いです:)
これは、バイト配列(byte [])の拡張方法です。
var b = new byte[] { 15, 22, 255, 84, 45, 65, 7, 28, 59, 10 };
Console.WriteLine(b.ToHexString());
public static class HexByteArrayExtensionMethods
{
private const int AllocateThreshold = 256;
private const string UpperHexChars = "0123456789ABCDEF";
private const string LowerhexChars = "0123456789abcdef";
private static string[] upperHexBytes;
private static string[] lowerHexBytes;
public static string ToHexString(this byte[] value)
{
return ToHexString(value, false);
}
public static string ToHexString(this byte[] value, bool upperCase)
{
if (value == null)
{
throw new ArgumentNullException("value");
}
if (value.Length == 0)
{
return string.Empty;
}
if (upperCase)
{
if (upperHexBytes != null)
{
return ToHexStringFast(value, upperHexBytes);
}
if (value.Length > AllocateThreshold)
{
return ToHexStringFast(value, UpperHexBytes);
}
return ToHexStringSlow(value, UpperHexChars);
}
if (lowerHexBytes != null)
{
return ToHexStringFast(value, lowerHexBytes);
}
if (value.Length > AllocateThreshold)
{
return ToHexStringFast(value, LowerHexBytes);
}
return ToHexStringSlow(value, LowerhexChars);
}
private static string ToHexStringSlow(byte[] value, string hexChars)
{
var hex = new char[value.Length * 2];
int j = 0;
for (var i = 0; i < value.Length; i++)
{
var b = value[i];
hex[j++] = hexChars[b >> 4];
hex[j++] = hexChars[b & 15];
}
return new string(hex);
}
private static string ToHexStringFast(byte[] value, string[] hexBytes)
{
var hex = new char[value.Length * 2];
int j = 0;
for (var i = 0; i < value.Length; i++)
{
var s = hexBytes[value[i]];
hex[j++] = s[0];
hex[j++] = s[1];
}
return new string(hex);
}
private static string[] UpperHexBytes
{
get
{
return (upperHexBytes ?? (upperHexBytes = new[] {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0A", "0B", "0C", "0D", "0E", "0F",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1A", "1B", "1C", "1D", "1E", "1F",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2A", "2B", "2C", "2D", "2E", "2F",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3A", "3B", "3C", "3D", "3E", "3F",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4A", "4B", "4C", "4D", "4E", "4F",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5A", "5B", "5C", "5D", "5E", "5F",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6A", "6B", "6C", "6D", "6E", "6F",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7A", "7B", "7C", "7D", "7E", "7F",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8A", "8B", "8C", "8D", "8E", "8F",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "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" }));
}
}
private static string[] LowerHexBytes
{
get
{
return (lowerHexBytes ?? (lowerHexBytes = new[] {
"00", "01", "02", "03", "04", "05", "06", "07", "08", "09", "0a", "0b", "0c", "0d", "0e", "0f",
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "1a", "1b", "1c", "1d", "1e", "1f",
"20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "2a", "2b", "2c", "2d", "2e", "2f",
"30", "31", "32", "33", "34", "35", "36", "37", "38", "39", "3a", "3b", "3c", "3d", "3e", "3f",
"40", "41", "42", "43", "44", "45", "46", "47", "48", "49", "4a", "4b", "4c", "4d", "4e", "4f",
"50", "51", "52", "53", "54", "55", "56", "57", "58", "59", "5a", "5b", "5c", "5d", "5e", "5f",
"60", "61", "62", "63", "64", "65", "66", "67", "68", "69", "6a", "6b", "6c", "6d", "6e", "6f",
"70", "71", "72", "73", "74", "75", "76", "77", "78", "79", "7a", "7b", "7c", "7d", "7e", "7f",
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "8a", "8b", "8c", "8d", "8e", "8f",
"90", "91", "92", "93", "94", "95", "96", "97", "98", "99", "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" }));
}
}
}
LINQでこれを行うための良い方法は...
var data = new byte[] { 1, 2, 4, 8, 16, 32 };
var hexString = data.Aggregate(new StringBuilder(),
(sb,v)=>sb.Append(v.ToString("X2"))
).ToString();
private static string GuidToRaw(Guid guid)
{
byte[] bytes = guid.ToByteArray();
int сharCount = bytes.Length * 2;
char[] chars = new char[сharCount];
int index = 0;
for (int i = 0; i < сharCount; i += 2)
{
byte b = bytes[index++];
chars[i] = GetHexValue((int)(b / 16));
chars[i + 1] = GetHexValue((int)(b % 16));
}
return new string(chars, 0, chars.Length);
}
private static char GetHexValue(int i)
{
return (char)(i < 10 ? i + 48 : i + 55);
}