Theo tôi, bạn muốn cẩn thận thực hiện việc này. Lý do người ta muốn chuyển đổi từ BigEndian sang LittleEndian là nếu các byte được đọc nằm trong BigEndian và hệ điều hành tính toán chống lại chúng đang hoạt động trong LittleEndian.
C# không còn là ngôn ngữ cửa sổ nữa. Với các cổng như Mono và các nền tảng khác của Microsoft như Windows Phone 7/8, Xbox 360/Xbox One, Windwos CE, Windows 8 Mobile, Linux Với MONO, Apple với MONO, v.v. Có thể là nền tảng điều hành có thể nằm trong BigEndian, trong trường hợp này bạn sẽ tự sửa lỗi nếu bạn đã chuyển đổi mã mà không thực hiện bất kỳ séc nào.
BitConverter đã có một trường trên đó được gọi là "IsLittleEndian", bạn có thể sử dụng điều này để xác định xem môi trường hoạt động có trong LittleEndian hay không. Sau đó, bạn có thể thực hiện việc đảo ngược có điều kiện.
Như vậy, tôi thực sự chỉ viết một số byte [] Tiện ích thay vì làm một lớp lớn:
/// <summary>
/// Get's a byte array from a point in a source byte array and reverses the bytes. Note, if the current platform is not in LittleEndian the input array is assumed to be BigEndian and the bytes are not returned in reverse order
/// </summary>
/// <param name="byteArray">The source array to get reversed bytes for</param>
/// <param name="startIndex">The index in the source array at which to begin the reverse</param>
/// <param name="count">The number of bytes to reverse</param>
/// <returns>A new array containing the reversed bytes, or a sub set of the array not reversed.</returns>
public static byte[] ReverseForBigEndian(this byte[] byteArray, int startIndex, int count)
{
if (BitConverter.IsLittleEndian)
return byteArray.Reverse(startIndex, count);
else
return byteArray.SubArray(startIndex, count);
}
public static byte[] Reverse(this byte[] byteArray, int startIndex, int count)
{
byte[] ret = new byte[count];
for (int i = startIndex + (count - 1); i >= startIndex; --i)
{
byte b = byteArray[i];
ret[(startIndex + (count - 1)) - i] = b;
}
return ret;
}
public static byte[] SubArray(this byte[] byteArray, int startIndex, int count)
{
byte[] ret = new byte[count];
for (int i = 0; i < count; ++i)
ret[0] = byteArray[i + startIndex];
return ret;
}
Vì vậy, tưởng tượng mã ví dụ này:
byte[] fontBytes = byte[240000]; //some data loaded in here, E.G. a TTF TrueTypeCollection font file. (which is in BigEndian)
int _ttcVersionMajor = BitConverter.ToUint16(fontBytes.ReverseForBigEndian(4, 2), 0);
//output
_ttcVersionMajor = 1 //TCCHeader is version 1
Skeet đã viết một: http: // www.yoda.arachsys.com/csharp/miscutil/ –
@ HansPassant, Đây có phải là một trong những dll yêu cầu tôi tạo mã nguồn mở của tôi không? Tại sao một số dll yêu cầu điều đó? – mowwwalker
Walkerneo Tôi đã xóa câu trả lời của mình vì zmbq đã trả lời về cơ bản điều tương tự 3 phút trước tôi. Khái niệm về tính cuối cùng không áp dụng cho các mảng byte, chỉ với các từ, dwords, qwords, v.v., đó là các nhóm 2, 4, 8 và các byte khác. Tôi xin lỗi nếu nó có nghĩa là thay đổi rất nhiều mã, nhưng một người đàn ông phải làm những gì một người đàn ông phải làm. –