【问题标题】:How to convert From Hex To Dump in C#如何在 C# 中从十六进制转换为转储
【发布时间】:2020-05-04 00:34:10
【问题描述】:

我将我的十六进制转换为转储以获得特殊字符,如符号,但是当我尝试转换我的“0x18”时,我“\u0018”这个值。谁能给我解决这个问题。

这是我的代码:

    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

【问题讨论】:

  • 我会重新考虑你的方法。看这里:stackoverflow.com/a/25639044/3135317
  • 我想将我的十六进制转换为特殊字符,例如像这样的“0xA3”= £但是当这个“0x18”我得到这样的“\u0018”
  • 试着采用我给你看的例子。
  • 您能提供一些转储示例吗?说,"abc0x1234def" 和预期结果?
  • @confidentialaccount .NET 字符串是 Unicode。这不是见仁见智的问题。您不需要任何类型的转义来在 Unicode 字符串中包含“特殊”字符。 \u0018 是 C# 转义序列,用于在 字符串文字 中插入 single, non printable Cancel Character,控制字符就像 CR 或 LF,即在代码。井号字符的转义序列是\u00A3。你确定你不会因为一些不存在的转义序列而混淆调试器的视图吗?

标签: c# string parsing


【解决方案1】:

您可以使用此代码:

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

【讨论】:

    【解决方案2】:

    问题不清楚 - 数据库列的类型是什么?它包含 6 个字节,还是 12 个字节的十六进制编码字符?无论如何,这与特殊字符或编码无关。

    首先,0x18 是拉丁语 1 代码页中 Cancel Character 的字节值,而不是 pound sign。那是0xA3。问题中的字节值似乎只是十六进制字符串的拉丁文 1 字节。

    .NET 字符串是 Unicode(特别是 UTF16LE)。没有 UTF8 字符串或 Latin1 字符串。将 bytes 转换为字符串时应用编码和代码页,反之亦然。这是使用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")));
    

    有很多问题可以说明如何parse a byte string into a byte array。我将窃取 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);
    

    【讨论】:

    • 我的数据库列数据类型是nvarchar
    【解决方案3】:

    首先你不需要转储,但需要 Unicode,我建议阅读有关 unicode/encoding 等以及为什么这是字符串的问题。

    PS:解决方案:StackOverflow

    【讨论】:

      猜你喜欢
      • 2018-11-18
      • 2015-07-12
      • 2023-03-31
      • 2014-12-31
      • 1970-01-01
      • 2021-06-26
      • 2019-06-10
      • 2015-12-03
      • 2017-07-31
      相关资源
      最近更新 更多