将字节数组从小端转换为大端或反之。

6

如何将小端字节数组Byte[]转换为大端字节顺序?

我想将这个程序移植到Mono上,想知道最好的方法。任何帮助都将不胜感激。

编辑:我在Windows和Mono上同时从文件中读取。

谢谢,Bob。


字节数组包含从文件中读取的内容。 - scope_creep
4个回答

4
除非您知道byte[]中的内容,否则无法将其转换为大端序。例如,2字节整数需要交换它们的两个字节,而4字节整数需要反转它们的4个字节。如果数组只包含一个整数,则可以翻转元素。如果不是,则需要单独处理数组中包含的每个不同实体。 Mono.DataConvert是一个库,如果您知道数组的哪些段需要作为什么类型的数据处理,它可以帮助您。我强烈推荐查看这个库;我在几个项目中使用它,非常方便。它甚至被MIT许可证授权,并且包含在一个源文件中,因此您可以直接将其编译到正在构建的任何程序集中。

嗨cdhowie,我看到了Mono.DataConvert,但不知道如何应用它。基本上,数组包含在日志文件中读取的任何内容,无论是在Windows还是在Mono上,在另一个系统上。我想确保无论在哪里阅读或读取,都将读取的内容转换为单一的字节序格式(Windows默认)。 - scope_creep
不知道日志文件的格式,你就什么也做不了。 - cdhowie
格式是怎样的?我知道我读取的每个文件的编码方式。 - scope_creep
我不确定我理解你的意思。编码?这是一个文本文件吗?如果是,那么字符编码是什么? - cdhowie
你从哪里得出我不知道格式的结论?我知道。如果你不知道怎么做,请不要发表评论。 - scope_creep
显示剩余14条评论

2

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

为了做到这一点,您必须首先确定构成所述整数、字符等的字节,然后翻转这些字节。简单地翻转/反转整个数组可能行不通(除非整个数组表示一个单独的整数、字符等)。

使用以下重载的Array.Reverse()方法来实现您想要的效果...

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

1
在我的情况下,我需要将给定的键(已经是小端格式)转换为大端字符串。这比我最初想象的要容易,而且不需要移位字节。下面是我用来测试它的简单控制台应用程序:
    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
您可以在此处找到一个有效的fiddle链接:从小端到大端

-1
你想要反转数组中的元素,还是字节本身的值?如果只是数组,那么你可以使用 Array.Reverse()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接