欧美成人精品手机在线观看_69视频国产_动漫精品第一页_日韩中文字幕网 - 日本欧美一区二区

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

C#.net core 基礎 - byte數組如何高效轉換為16進制字符串

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

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

往往在處理字符串性能問題時,首先應該想到的是怎么想辦法減少內存分配,怎么優化字符串構建。

下面就通過遞進的方式介紹幾種實現方式。

1. 使用 StringBuilder

在需要做大量字符串拼接的場景中,我們首先就會想到StringBuilder,相比string類型來說StringBuilder更高效。在這個例子中,它通過一次性分配足夠的內存,然后配合字節格式化方法AppendFormat進行轉換,并逐個追加每個字節的 16 進制表示,以此減少內存分配的開銷。

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對ToHexStringStringBuilder方法進行些基準測試,分別對字節數組長度為100、1000、10000個元素分別進行10000次測試,然后進行橫向對比。

 

可以發現這個方法隨著數組長度增加整體性能是在下降的。

2. 使用 BitConverter

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

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

下面我們再次使用Benchmark對ToHexStringBitConverter方法進行些基準測試,分別對字節數組長度為100、1000、10000個元素各進行10000次測試,進行橫向對比。

 

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

3. 使用 Convert(.NET5+)

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

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

下面我們再次使用Benchmark對ToHexStringConvert方法進行些基準測試,分別對字節數組長度為100、1000、10000個元素各進行10000次測試,然后進行橫向對比。

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

4. 使用位運算

在將 byte[] 轉換為 16 進制字符串時,每個字節會被轉化為兩個字符。因此,我們需要一個長度為 bytes.Length * 2 的字符數組來存儲最終的 16 進制字符串。同時定義字符串hex = "0123456789abcdef";這個字符串中包含了所有可能的 16 進制字符,接下來遍歷循環把每個字節通過位運算分解為2個 4 位的部分(高 4 位和低 4 位),然后通過字符串hex將高4位轉為16進制第一個字符,低4位轉為第二個字符。以下是一個示例實現:

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);
    }
}

下面我們再次使用Benchmark對ToHexStringBitOperation方法進行些基準測試,分別對字節數組長度為100、1000、10000個元素各進行10000次測試,然后進行橫向對比。

 

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

如果對位運算不是很明白的,可以留言,后面可以單獨出一篇文章講解一下。

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

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

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);
    }
} 

下面我們再次使用Benchmark對ToHexStringBitConverter方法進行些基準測試,分別對字節數組長度為100、1000、10000個元素各進行10000次測試,然后進行橫向對比。

 

位運算方式相比,并沒有像前面的大幅提升,相差無幾。

下面看看5種方法,整體對比情況:

 

通過上面一系列測試,我們可以得到如下總結:

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

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

如果只是要把字節數組轉化為字符串沒有什么要求,那么直接選擇官方自帶方法Convert.ToHexString;如果對于輸出格式有要求,則可以用位操作的方式自己實現個性化需求;當在極端特殊情況下可以考慮unsafe 代碼塊方式。

轉自https://www.cnblogs.com/hugogoos/p/18385298


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