【问题标题】:How to return a byte from a byte array with the Full Hex Value?如何从具有完整十六进制值的字节数组中返回一个字节?
【发布时间】:2017-07-17 17:57:14
【问题描述】:

所以我正在创建一个读取字节数组并返回值的程序

byte[] buffer1 = File.ReadAllBytes(path).Skip(startPos).Take(lengthToExtract).ToArray();
byte[] reversed = buffer1.Reverse().ToArray();
string buffer2 = "";
foreach (var i in reversed)
{
   buffer2 = buffer2 + i.ToString("X") + " ";
}
MessageBox.Show(buffer2);
int size = int.Parse(buffer2.Replace(" ", string.Empty), System.Globalization.NumberStyles.HexNumber);
return size;

但是当我得到值的十六进制字符串缓冲区的值的消息框时,它会取出“不重要的”十六进制数字,这会弄乱我的值。例如,如果读取的字节为 0x00,它将返回值为 0,而我正在向后读取结果字节,因此:0x04080 (0 4 0 80) 与 0x0040080 (00 04 00 80) 不同。我需要帮助,这弄乱了我的整个程序。

【问题讨论】:

    标签: c# arrays numbers hex byte


    【解决方案1】:

    您可以使用以下 2 个功能。他们将解决这两个问题 - 两位数和字节顺序

        public static string HexStringFromArrayChangeEndian(byte[] data)
        {
            StringBuilder sdata = new StringBuilder();
            for (int s = data.Length - 1; s >= 0; s--)
                sdata.Append(string.Format("{0:X}", data[s]).PadLeft(2, '0'));
            return sdata.ToString();
        }
    
        public static string HexStringFromArraySameEndian(byte[] data)
        {
            StringBuilder sdata = new StringBuilder();
            for (int s = 0; s < data.Length; s++)
                sdata.Append(string.Format("{0:X}", data[s]).PadLeft(2, '0'));
            return sdata.ToString();
        }
    

    【讨论】:

    • 您调用PadLeft 的行可以简化为sdata.Append(data[s].ToString("X2"));,这将防止创建一堆额外的字符串。 +1 虽然使用 StringBuilder 来防止垃圾收集器对你生气。可以更进一步,让它StringBuilder sdata = new StringBuilder(data.Length * 2);
    • @LeeHiles 当然。这些将是一些改进
    【解决方案2】:

    使用i.ToString("X2")。将强制字符串输出“00”而不是简化的“0”

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2015-08-08
      • 2012-01-04
      • 2013-06-24
      • 1970-01-01
      • 2013-09-20
      • 1970-01-01
      • 2017-09-13
      • 1970-01-01
      相关资源
      最近更新 更多