【问题标题】:How to convert a byte array with hexadecimal contents to string with decimal in c#如何在c#中将具有十六进制内容的字节数组转换为具有十进制的字符串
【发布时间】:2009-03-28 14:37:36
【问题描述】:

语言:C#

基本上我有一个包含十六进制内容的字节数组。

我想把它转成String,16进制的内容也要转成Decimal的内容。

我的最终字符串应该包含初始字节数组中包含的十六进制值的等效十进制值。

我将字节数组转换为字符串使用 System.Text.Encoding.GetEncoding(1251).GetString

但是如何将十六进制转换为十进制? 即使我们可以分多个步骤完成,也不是问题。

不好意思问个傻问题,请备用。

提前致谢!

【问题讨论】:

  • 你能举个例子吗 - 转换为十进制意味着 { 0x1, 0x0, 0x3 } 会变成字符串“1,0,3”或“259”或“719”吗?

标签: c#


【解决方案1】:

你的意思并不完全清楚。

字节数组只包含字节值——它们只是数字。换句话说:

byte x = 0x20;
byte y = 32;

完全相同 - 他们都只是将值设置为 32。

现在,如果您想将字节数组转换为数字,请查看BitConverter 及其类似BitConverter.ToInt32 的方法。这会将字节数组转换为数字(在这种特殊情况下为 int) - 然后您只需在数字上调用 ToString() 即可将十进制表示为字符串。

您的原始数据是多少字节?这将是决定调用哪个BitConverter 方法的关键因素。您还需要知道数据的字节序 - 如果“正常”.NET 中的 BitConverter 是小字节序;如果您的数据是真正的大端数据,您可能对我的MiscUtil library 中的EndianBitConverter 类感兴趣。

【讨论】:

    【解决方案2】:

    如果您的数组确实包含数字的十六进制表示的字符代码,那么您不必费心解码。由于这些字符的字符代码在所有常规编码中都是相同的,因此您只需将字节转换为字符即可。

    我写了一个将字符流解析为字节流的扩展:

    static class Hex {
    
        public static IEnumerable<byte> ParseHex(this IEnumerable<char> chars) {
            int buffer = 0;
            bool first = true;
            foreach (char c in chars) {
                int b = (c - '0') % 32;
                if (b > 9) b -= 7;
                if (first) {
                    buffer |= b << 4;
                } else {
                    yield return (byte)(buffer | b);
                    buffer = 0;
                }
                first = !first;
            }
            if (!first) {
                    yield return (byte)buffer;
            }
        }
    
    }
    

    (如果有人识别出部分代码,则基于我在this 答案中的代码。)

    用法:

    byte[] data = { 48, 70, 51, 67, 70, 56, 48, 55, 57, 49 };
    
    string result = string.Join(",",
        data.Cast<char>().ParseHex().Select(b => b.ToString()).ToArray()
    );
    

    【讨论】:

      【解决方案3】:

      我有点不确定你想做什么。您是否正在尝试创建一个逗号分隔的十进制数字字符串 - 例如:

      byte[] hexValues = { 0x9, 0xA, 0xB, 0xC, 0xD, 0xE, 0xF };
      string decimalValuesAsStringList = string.Join(",", hexValues.Select(i => i.ToString()).ToArray());
      

      ...或者像这样:

      char[] hexCharacters = { '9', 'A', 'B', 'C', 'D', 'E', 'F' };
      byte[] hexValues = hexCharacters.Select(c => Convert.ToByte(c)).ToArray();
      string decimalValuesAsStringList = string.Join(",", hexValues.Select(i => Convert.ToInt32(((char)i).ToString(), 16).ToString()).ToArray());
      

      【讨论】:

        猜你喜欢
        • 2017-06-17
        • 2017-08-23
        • 2017-03-11
        • 2019-07-27
        • 1970-01-01
        • 2018-01-31
        • 2013-01-14
        • 2014-03-19
        相关资源
        最近更新 更多