android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...
我通過一些粗略的Stopwatch性能測試運行了各種轉換方法,一個帶有隨機句子的運行(n = 61,1000次迭代)和一個帶有Project Gutenburg文本的運行(n = 1,238,957,150次迭代)。以下是結果,大致從最快到最慢。所有測量均以刻度(10,000滴= 1毫秒)為單位,所有相關注釋與[最慢]?StringBuilder實施進行比較。對于使用的代碼,請參閱下面或測試框架repo,其中我現在維護用于運行此代碼的代碼。
放棄
警告:不要將這些屬性用于任何混凝土;?它們只是樣本數據的樣本運行。如果您確實需要一流的性能,請在代表您的生產需求的環境中測試這些方法,并使用代表您將使用的數據。
結果
查找表已經領先于字節操作。基本上,有一些形式的預計算任何給定的半字節或字節將以十六進制表示。然后,當您瀏覽數據時,只需查找下一部分即可看到它將是什么十六進制字符串。然后以某種方式將該值添加到結果字符串輸出中。對于長時間的字節操作,一些開發人員可能更難閱讀,是表現最好的方法。
您最好的選擇仍然是找到一些有代表性的數據并在類似生產的環境中進行嘗試。如果您有不同的內存限制,您可能更喜歡使用較少分配的方法,但速度更快但消耗更多內存的方法。
測試代碼
隨意玩我使用的測試代碼。這里包含一個版本,但可以隨意克隆存儲庫并添加自己的方法。如果您發現任何有趣的內容或希望幫助改進其使用的測試框架,請提交拉取請求。將新的靜態方法(Func)添加到/Tests/ConvertByteArrayToHexString/Test.cs。
將該方法的名稱添加到TestCandidates同一個類中的返回值。
通過GenerateTestInput在同一個類中切換注釋,確保運行所需的輸入版本,句子或文本。
點擊F5并等待輸出(在/ bin文件夾中也生成HTML轉儲)。static?string?ByteArrayToHexStringViaStringJoinArrayConvertAll(byte[]?bytes)?{
return?string.Join(string.Empty,?Array.ConvertAll(bytes,?b?=>?b.ToString("X2")));}
static?string?ByteArrayToHexStringViaStringConcatArrayConvertAll(byte[]?bytes)?{
return?string.Concat(Array.ConvertAll(bytes,?b?=>?b.ToString("X2")));}static?string?ByteArrayToHexStringViaBitConverter(byte[]?bytes)?{
string?hex?=?BitConverter.ToString(bytes);
return?hex.Replace("-",?"");}static?string?ByteArrayToHexStringViaStringBuilderAggregateByteToString(byte[]?bytes)?{
return?bytes.Aggregate(new?StringBuilder(bytes.Length?*?2),?(sb,?b)?=>?sb.Append(b.ToString("X2"))).ToString();}
static?string?ByteArrayToHexStringViaStringBuilderForEachByteToString(byte[]?bytes)?{
StringBuilder?hex?=?new?StringBuilder(bytes.Length?*?2);
foreach?(byte?b?in?bytes)
hex.Append(b.ToString("X2"));
return?hex.ToString();}static?string?ByteArrayToHexStringViaStringBuilderAggregateAppendFormat(byte[]?bytes)?{
return?bytes.Aggregate(new?StringBuilder(bytes.Length?*?2),?(sb,?b)?=>?sb.AppendFormat("{0:X2}",?b)).ToString();}
static?string?ByteArrayToHexStringViaStringBuilderForEachAppendFormat(byte[]?bytes)?{
StringBuilder?hex?=?new?StringBuilder(bytes.Length?*?2);
foreach?(byte?b?in?bytes)
hex.AppendFormat("{0:X2}",?b);
return?hex.ToString();}static?string?ByteArrayToHexViaByteManipulation(byte[]?bytes)?{
char[]?c?=?new?char[bytes.Length?*?2];
byte?b;
for?(int?i?=?0;?i?
b?=?((byte)(bytes[i]?>>?4));
c[i?*?2]?=?(char)(b?>?9???b?+?0x37?:?b?+?0x30);
b?=?((byte)(bytes[i]?&?0xF));
c[i?*?2?+?1]?=?(char)(b?>?9???b?+?0x37?:?b?+?0x30);
}
return?new?string(c);}static?string?ByteArrayToHexViaByteManipulation2(byte[]?bytes)?{
char[]?c?=?new?char[bytes.Length?*?2];
int?b;
for?(int?i?=?0;?i?
b?=?bytes[i]?>>?4;
c[i?*?2]?=?(char)(55?+?b?+?(((b?-?10)?>>?31)?&?-7));
b?=?bytes[i]?&?0xF;
c[i?*?2?+?1]?=?(char)(55?+?b?+?(((b?-?10)?>>?31)?&?-7));
}
return?new?string(c);}static?string?ByteArrayToHexViaSoapHexBinary(byte[]?bytes)?{
SoapHexBinary?soapHexBinary?=?new?SoapHexBinary(bytes);
return?soapHexBinary.ToString();}static?string?ByteArrayToHexViaLookupAndShift(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();}static?readonly?uint*?_lookup32UnsafeP?=?(uint*)GCHandle.Alloc(_Lookup32,?GCHandleType.Pinned)
.AddrOfPinnedObject();static?string?ByteArrayToHexViaLookup32UnsafeDirect(byte[]?bytes)?{
var?lookupP?=?_lookup32UnsafeP;
var?result?=?new?string((char)0,?bytes.Length?*?2);
fixed?(byte*?bytesP?=?bytes)
fixed?(char*?resultP?=?result)?{
uint*?resultP2?=?(uint*)resultP;
for?(int?i?=?0;?i?
resultP2[i]?=?lookupP[bytesP[i]];
}
}
return?result;}static?uint[]?_Lookup32?=?Enumerable.Range(0,?255).Select(i?=>?{
string?s?=?i.ToString("X2");
return?((uint)s[0])?+?((uint)s[1]?<
var?result?=?new?char[bytes.Length?*?2];
for?(int?i?=?0;?i?
{
var?val?=?_Lookup32[bytes[i]];
result[2*i]?=?(char)val;
result[2*i?+?1]?=?(char)?(val?>>?16);
}
return?new?string(result);}static?string?ByteArrayToHexViaLookup(byte[]?bytes)?{
string[]?hexStringTable?=?new?string[]?{
"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",
};
StringBuilder?result?=?new?StringBuilder(bytes.Length?*?2);
foreach?(byte?b?in?bytes)?{
result.Append(hexStringTable[b]);
}
return?result.ToString();}
總結
以上是生活随笔為你收集整理的android byte转16进制字符串,如何将字节数组转换为十六进制字符串,反之亦然?...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言socket调用图灵API,soc
- 下一篇: android 泰语资源,Android