【问题标题】:Convert byte array from small to big endian or vice versa将字节数组从小端转换为大端,反之亦然
【发布时间】:2011-01-10 16:59:23
【问题描述】:

如何将字节数组 Byte[] 从小端转换为大端。

我正在考虑将此程序移植到 Mono 并且想知道最好的方法。任何帮助,将不胜感激。

编辑:我正在从寡妇和单声道文件中读取。

谢谢。 鲍勃。

【问题讨论】:

  • 字节数组包含从文件中读取的任何内容。

标签: c#-4.0 endianness


【解决方案1】:

除非您知道byte[] 中的内容,否则您不能“​​将byte[] 转换为大端”。例如,2 字节整数需要交换它们的两个字节,而 4 字节整数需要颠倒它们的 4 个字节。如果数组只包含一个整数,则反转元素将起作用。如果不是,您将需要分别处理数组中包含的每个不同实体。

Mono.DataConvert 是一个可以在这里提供帮助的库,如果您知道数组的哪些段需要被视为哪种数据类型。我强烈建议查看这个库;我在几个项目中使用它,它非常漂亮。它甚至是 MIT 许可的,并且包含在一个源文件中,因此您可以直接将其编译到您正在构建的任何程序集中。

【讨论】:

  • 嗨 cdhowie,我看到了 Mono.DataConvert,但不知道如何应用它。本质上,该数组包含在另一个系统上的 Windows 或 Mono 上的日志文件中读取的任何内容。对于所有日志阅读器,无论它驻留或读取的位置,我都不会确保读取的任何内容都是单端格式(Windows 默认)。
  • 在不知道该日志文件的格式的情况下,您将无能为力。
  • 格式如何。我知道我正在阅读的每个文件的编码。
  • 我不确定我明白你的意思。编码?这是文本文件吗?如果有,字符编码是什么?
  • 是的,它是一个文本文件。 ASCII 但很容易是 unicode 或 UTF32。
【解决方案2】:

嗯,我认为这里有问题。字节数组很少天生就是大端或小端。一个字节几乎总是与字节序无关。您可能想要的是更正字节数组中包含的整数、字符等的字节顺序。

为此,您必须首先识别构成所述整数、字符等的字节,然后翻转这些字节。简单地翻转/反转整个数组可能不起作用(除非整个数组代表一个整数、字符等)

使用Array.Reverse() 方法的以下重载来做你想做的事...

public static void Reverse(
    Array array,
    int index,
    int length
)

【讨论】:

    【解决方案3】:

    就我而言,我需要将给定的键(已经是小端格式)转换为大端字符串。这比我最初想象的要容易,并且不需要移动字节。这是我用来测试的一个简单的控制台应用程序:

        using System;
        using System.Text;
    
        public class Program
        {
            public static void Main()
            {   
                string key = "B13E745599654841172F741A662880D4";
                var guid = new Guid(key);
                string hex = HexStringFromBytes(guid.ToByteArray());
                Console.WriteLine("Original key: " + guid);
                Console.WriteLine();                
                Console.WriteLine("Big-endian version of the key: " + hex);
                Console.ReadLine();
            }
    
            public static string HexStringFromBytes(byte[] bytes)
            {
                var sb = new StringBuilder();
                foreach (byte b in bytes)
                {
                    var hex = b.ToString("x2");
                    sb.Append(hex);
                }
                return sb.ToString();
            }
        }
    

    给定的示例在控制台中打印:

    原始密钥:B13E7455-9965-4841-172F-741A662880D4

    大端版本的密钥:55743eb165994148172f741a662880d4

    你可以在这里找到一个工作小提琴:Little Endian to Big Endian

    【讨论】:

      【解决方案4】:

      您想反转数组中的项目,还是反转字节本身的值?如果只是数组,那么你可以使用Array.Reverse()

      【讨论】:

        猜你喜欢
        • 2015-02-16
        • 2013-11-11
        • 2013-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多