簡體   English   中英

如何在 C# 中從十六進制轉換為轉儲

[英]How to convert From Hex To Dump in C#

我將我的十六進制轉換為轉儲以獲得像符號這樣的特殊字符,但是當我嘗試轉換我的“0x18”我“\”這個值。 誰能給我關於這個問題的解決方案。

這是我的代碼:

    public static string FromHexDump(string sText)
    {
        Int32 lIdx;
        string prValue ="" ;
        for (lIdx = 1; lIdx < sText.Length; lIdx += 2)
        {
            string prString = "0x" + Mid(sText, lIdx, 2);
            string prUniCode = Convert.ToChar(Convert.ToInt64(prString,16)).ToString();
            prValue = prValue + prUniCode;
        }
        return prValue;
    }

我用的是VB語言。 我有一個數據庫,它已經將文本加密到我的密碼中,值是這樣的BAA37D40186D所以我按步驟 2 循環它,它會喜歡這個0xBA,0xA3,0x7D,0x40,0x18,0x6D並且 VB 結果變得像這樣º£}@m

您可以使用此代碼:

var myHex = '\x0633';
var formattedString += string.Format(@"\x{0:x4}", (int)myHex);

或者您可以使用 MSDN 中的此代碼( https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-between-hexadecimal-strings-and-numeric-types ):

string hexValues = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
string[] hexValuesSplit = hexValues.Split(' ');
foreach (string hex in hexValuesSplit)
{
    // Convert the number expressed in base-16 to an integer.
    int value = Convert.ToInt32(hex, 16);
    // Get the character corresponding to the integral value.
    string stringValue = Char.ConvertFromUtf32(value);
    char charValue = (char)value;
    Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}",
                        hex, value, stringValue, charValue);
}

問題不清楚 - 數據庫列的類型是什么? 它包含 6 個字節,還是包含 12 個字節的十六進制編碼字符? 無論如何,這與特殊字符或編碼無關。

首先,0x18 是拉丁語 1 代碼頁中取消字符的字節值,而不是井號 那是 0xA3。 問題中的字節值似乎只是十六進制字符串的拉丁語 1 字節。

.NET 字符串是 Unicode(特別是 UTF16LE)。 沒有 UTF8 字符串或 Latin1 字符串。 編碼和代碼頁適用於將字節轉換為字符串,反之亦然。 這是使用Encoding類完成的,例如Encoding.GetBytes

在這種情況下,此代碼會將字節轉換為預期的字符串形式,包括不可打印的字符:

new byte[] {0xBA,0xA3,0x7D,0x40,0x18,0x6D};
var latinEncoding=Encoding.GetEncoding(1252);
var result=latinEncoding.GetString(dbBytes);

結果是:

º£}@m

@m之間使用取消字符。

如果數據庫列包含字節值作為字符串:

  1. 它需要兩倍所需的空間和
  2. 在轉換為字符串之前,必須將十六進制值轉換回字節

x格式用於將數字或字節轉換為它們的十六進制形式,反之亦然。 對於每個字節值, ToString("x")返回十六進制字符串。

十六進制字符串可以從原始緩沖區生成:

var dbBytes=new byte[] {0xBA,0xA3,0x7D,0x40,0x18,0x6D};
var hexString=String.Join("",dbBytes.Select(c=>c.ToString("x")));

有很多問題展示了如何將字節字符串解析為字節數組 我只會竊取 Jared Parson 的 LINQ 答案:

public static byte[] StringToByteArray(string hex) {
    return Enumerable.Range(0, hex.Length)
                     .Where(x => x % 2 == 0)
                     .Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
                     .ToArray();
}

有了這個,我們可以將十六進制字符串解析為字節數組並將其轉換為原始字符串:

var bytes=StringToByteArray(hexString);
var latinEncoding=Encoding.GetEncoding(1252);
var result=latinEncoding.GetString(bytes);

首先,你不需要轉儲而是 Unicode,我建議閱讀有關 unicode/encoding 等的信息,以及為什么這是字符串的問題。

PS:解決方案: StackOverflow

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM