人妻夜夜爽天天爽三区丁香花-人妻夜夜爽天天爽三-人妻夜夜爽天天爽欧美色院-人妻夜夜爽天天爽免费视频-人妻夜夜爽天天爽-人妻夜夜爽天天

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

C#.net core 基礎(chǔ) - byte數(shù)組如何高效轉(zhuǎn)換為16進(jìn)制字符串

freeflydom
2025年1月6日 10:15 本文熱度 382

在 .NET Core 中,如何把 byte[] 轉(zhuǎn)換為 16 進(jìn)制字符串?你能想到哪些方法?什么方式性能最好?今天和大家分享幾種轉(zhuǎn)換方式。

往往在處理字符串性能問(wèn)題時(shí),首先應(yīng)該想到的是怎么想辦法減少內(nèi)存分配,怎么優(yōu)化字符串構(gòu)建。

下面就通過(guò)遞進(jìn)的方式介紹幾種實(shí)現(xiàn)方式。

1. 使用 StringBuilder

在需要做大量字符串拼接的場(chǎng)景中,我們首先就會(huì)想到StringBuilder,相比string類型來(lái)說(shuō)StringBuilder更高效。在這個(gè)例子中,它通過(guò)一次性分配足夠的內(nèi)存,然后配合字節(jié)格式化方法AppendFormat進(jìn)行轉(zhuǎn)換,并逐個(gè)追加每個(gè)字節(jié)的 16 進(jìn)制表示,以此減少內(nèi)存分配的開銷。

using System;
using System.Text;
public class BytesToHexString
{
    public static string ToHexStringStringBuilder(byte[] bytes)
    {
      StringBuilder hex = new StringBuilder(bytes.Length * 2);
      foreach (byte b in bytes)
      {
          hex.AppendFormat("{0:x2}", b);
      }
      return hex.ToString();
    }
}

下面我們使用Benchmark對(duì)ToHexStringStringBuilder方法進(jìn)行些基準(zhǔn)測(cè)試,分別對(duì)字節(jié)數(shù)組長(zhǎng)度為100、1000、10000個(gè)元素分別進(jìn)行10000次測(cè)試,然后進(jìn)行橫向?qū)Ρ取?/p>

 

可以發(fā)現(xiàn)這個(gè)方法隨著數(shù)組長(zhǎng)度增加整體性能是在下降的。

2. 使用 BitConverter

BitConverter 是 .NET 中的內(nèi)置類,它提供了一種簡(jiǎn)單的方式來(lái)轉(zhuǎn)換基礎(chǔ)數(shù)據(jù)類型為字符串。代碼非常簡(jiǎn)潔,但是其本身只能輸出固定格式如“0A-BC-99”,有連接符“-”并且字母都是大寫,因此只適合簡(jiǎn)單需求,如果有復(fù)雜要求還行額外單獨(dú)處理。

using System;
public class BytesToHexString
{
    public static string ToHexStringBitConverter (byte[] bytes)
    {
        return BitConverter.ToString(bytes);
    }
}

下面我們?cè)俅问褂肂enchmark對(duì)ToHexStringBitConverter方法進(jìn)行些基準(zhǔn)測(cè)試,分別對(duì)字節(jié)數(shù)組長(zhǎng)度為100、1000、10000個(gè)元素各進(jìn)行10000次測(cè)試,進(jìn)行橫向?qū)Ρ取?/p>

 

StringBuilder方式對(duì)比,性能得到大幅度提升。

3. 使用 Convert(.NET5+)

Convert是 .NET 中的內(nèi)置類,Convert.ToHexString是在 .NET 5 中引入的方法,用于將字節(jié)數(shù)組直接轉(zhuǎn)換為十六進(jìn)制字符串,改方法設(shè)計(jì)之初就考慮了性能,它在實(shí)現(xiàn)上減少了額外的內(nèi)存分配和操作,因此它比 BitConverter.ToString 更高效。但是其本身只能輸出固定格式如“0ABC99”,沒(méi)有連接符“-”并且字母都是大寫。

using System;
public class BytesToHexString
{
    public static string ToHexStringConvert (byte[] bytes)
    {
        return Convert.ToHexString (bytes);
    }
}

下面我們?cè)俅问褂肂enchmark對(duì)ToHexStringConvert方法進(jìn)行些基準(zhǔn)測(cè)試,分別對(duì)字節(jié)數(shù)組長(zhǎng)度為100、1000、10000個(gè)元素各進(jìn)行10000次測(cè)試,然后進(jìn)行橫向?qū)Ρ取?/p>

BitConverter方式對(duì)比,性能也是大幅度提升。

4. 使用位運(yùn)算

在將 byte[] 轉(zhuǎn)換為 16 進(jìn)制字符串時(shí),每個(gè)字節(jié)會(huì)被轉(zhuǎn)化為兩個(gè)字符。因此,我們需要一個(gè)長(zhǎng)度為 bytes.Length * 2 的字符數(shù)組來(lái)存儲(chǔ)最終的 16 進(jìn)制字符串。同時(shí)定義字符串hex = "0123456789abcdef";這個(gè)字符串中包含了所有可能的 16 進(jìn)制字符,接下來(lái)遍歷循環(huán)把每個(gè)字節(jié)通過(guò)位運(yùn)算分解為2個(gè) 4 位的部分(高 4 位和低 4 位),然后通過(guò)字符串hex將高4位轉(zhuǎn)為16進(jìn)制第一個(gè)字符,低4位轉(zhuǎn)為第二個(gè)字符。以下是一個(gè)示例實(shí)現(xiàn):

using System;
public class BytesToHexString
{
    public static string ToHexStringBitOperation (byte[] bytes)
    {
        char[] hexChars = new char[bytes.Length * 2];
        const string hex = "0123456789abcdef";
        for (int i = 0; i < bytes.Length; i++)
        {
            hexChars[i * 2] = hex[bytes[i] >> 4];
            hexChars[i * 2 + 1] = hex[bytes[i] & 0x0F];
        }
        return new string(hexChars);
    }
}

下面我們?cè)俅问褂肂enchmark對(duì)ToHexStringBitOperation方法進(jìn)行些基準(zhǔn)測(cè)試,分別對(duì)字節(jié)數(shù)組長(zhǎng)度為100、1000、10000個(gè)元素各進(jìn)行10000次測(cè)試,然后進(jìn)行橫向?qū)Ρ取?/p>

 

雖然和BitConverter相比,性能提升3倍多,但是和Convert方式相比卻有所差距。

如果對(duì)位運(yùn)算不是很明白的,可以留言,后面可以單獨(dú)出一篇文章講解一下。

5. 使用 unsafe 代碼塊(高級(jí))

如果你需要極致的性能,并且可以接受 unsafe 代碼,你可以使用指針來(lái)操作字節(jié)數(shù)組。這種方法可以極大地提高性能,但需要注意內(nèi)存安全問(wèn)題。

using System;
public class BytesToHexString
{
    public static unsafe string ToHexStringUnsafe(byte[] bytes)
    {
        const string hex = "0123456789ABCDEF";
        var hexChars = new char[bytes.Length * 2];
        fixed (byte* bytePtr = bytes)
        {
            fixed (char* charPtr = hexChars)
            {
                byte* source = bytePtr;
                char* dest = charPtr;
                for (int i = 0; i < bytes.Length; i++)
                {
                    byte b = source[i];
                    dest[i * 2] = hex[b >> 4];
                    dest[i * 2 + 1] = hex[b & 0x0F];
                }
            }
        }
        return new string(hexChars);
    }
} 

下面我們?cè)俅问褂肂enchmark對(duì)ToHexStringBitConverter方法進(jìn)行些基準(zhǔn)測(cè)試,分別對(duì)字節(jié)數(shù)組長(zhǎng)度為100、1000、10000個(gè)元素各進(jìn)行10000次測(cè)試,然后進(jìn)行橫向?qū)Ρ取?/p>

 

位運(yùn)算方式相比,并沒(méi)有像前面的大幅提升,相差無(wú)幾。

下面看看5種方法,整體對(duì)比情況:

 

通過(guò)上面一系列測(cè)試,我們可以得到如下總結(jié):

靈活性:StringBuilder、位操作、unsafe 代碼塊 > BitConverter、Convert

性能:Convert > unsafe 代碼塊 > 位操作 > BitConverter > StringBuilder

如果只是要把字節(jié)數(shù)組轉(zhuǎn)化為字符串沒(méi)有什么要求,那么直接選擇官方自帶方法Convert.ToHexString;如果對(duì)于輸出格式有要求,則可以用位操作的方式自己實(shí)現(xiàn)個(gè)性化需求;當(dāng)在極端特殊情況下可以考慮unsafe 代碼塊方式。

轉(zhuǎn)自https://www.cnblogs.com/hugogoos/p/18385298


該文章在 2025/1/6 10:15:11 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 东京热人妻av中文系列 | 亚洲精品国产自在现线 | a一区二区三区电影无码 | 超碰97av 在线人人操 | 精品无码国产一区二区三区麻豆 | 中文字幕第4页 | 九九视频在线看精品 | 国产精品手机在线播放 | 国产欧美一区二区三区四区 | 国产99精品一区二区三区免费 | 2024精品天堂在线视频 | 91国内精品久久久久免费影院 | 91久久国产成人免费观看资源 | 国产欧美日韩精品a在线观看 | 中文字幕一区二区高清在线 | 亚洲午夜无码久久久久小说 | 国产成 人 综合 亚洲网 | 精品国产中文在线二区三区四区 | 欧美在线免费看 | 国产欧美另类精品久久久 | 精品人伦一区二区三区蜜桃小说 | 无码人妻丰满熟妇精品区 | 国产熟妇无码一区二区三区H | a真人一级毛片日韩区 | 海角国精产品一区一区三区糖心推荐 | 二区偷拍美女撒尿视频 | 国产波霸爆乳一区二区精品 | 无码人妻aⅴ一区二区三区有奶水 | 亚洲日本无码高清一区二区 | 2024年高清无码一区 | 亚洲永久精品免费ww52com | 精品久久洲久久久久护士免费 | 精品人妻久久久久久888 | 99无码毛片网址 | 91福利视频网站 | 少妇人妻在线视频 | 中文字幕人成乱在线视频 | 91破处视频| 国产精品反差婊在线观看 | 日本人妻仑乱少妇A级毛片一 | 欧洲国产日产综合 |