【发布时间】:2011-01-10 16:59:23
【问题描述】:
如何将字节数组 Byte[] 从小端转换为大端。
我正在考虑将此程序移植到 Mono 并且想知道最好的方法。任何帮助,将不胜感激。
编辑:我正在从寡妇和单声道文件中读取。
谢谢。 鲍勃。
【问题讨论】:
-
字节数组包含从文件中读取的任何内容。
标签: c#-4.0 endianness
如何将字节数组 Byte[] 从小端转换为大端。
我正在考虑将此程序移植到 Mono 并且想知道最好的方法。任何帮助,将不胜感激。
编辑:我正在从寡妇和单声道文件中读取。
谢谢。 鲍勃。
【问题讨论】:
标签: c#-4.0 endianness
除非您知道byte[] 中的内容,否则您不能“将byte[] 转换为大端”。例如,2 字节整数需要交换它们的两个字节,而 4 字节整数需要颠倒它们的 4 个字节。如果数组只包含一个整数,则反转元素将起作用。如果不是,您将需要分别处理数组中包含的每个不同实体。
Mono.DataConvert 是一个可以在这里提供帮助的库,如果您知道数组的哪些段需要被视为哪种数据类型。我强烈建议查看这个库;我在几个项目中使用它,它非常漂亮。它甚至是 MIT 许可的,并且包含在一个源文件中,因此您可以直接将其编译到您正在构建的任何程序集中。
【讨论】:
嗯,我认为这里有问题。字节数组很少天生就是大端或小端。一个字节几乎总是与字节序无关。您可能想要的是更正字节数组中包含的整数、字符等的字节顺序。
为此,您必须首先识别构成所述整数、字符等的字节,然后翻转这些字节。简单地翻转/反转整个数组可能不起作用(除非整个数组代表一个整数、字符等)
使用Array.Reverse() 方法的以下重载来做你想做的事...
public static void Reverse(
Array array,
int index,
int length
)
【讨论】:
就我而言,我需要将给定的键(已经是小端格式)转换为大端字符串。这比我最初想象的要容易,并且不需要移动字节。这是我用来测试的一个简单的控制台应用程序:
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
【讨论】:
您想反转数组中的项目,还是反转字节本身的值?如果只是数组,那么你可以使用Array.Reverse()
【讨论】: