2011-01-10 4 views
2

Как преобразовать массив байтов, Byte [] от малого до большого endian.Преобразование байтового массива от малого до большого или наоборот

Я подумываю перенести эту программу на Моно и задавался вопросом о наилучшем подходе. Любая помощь будет оценена по достоинству.

EDIT: Я читаю из файла как на вдовах, так и на моно.

Спасибо. Боб.

+0

массив байт содержит whatevers читать фр om файл. –

ответ

3

Вы не можете «конвертировать byte[] в большой эндиан», если вы не знаете, что находится в byte[]. Например, 2-байтовые целые числа должны будут иметь свои байты с байтами, в то время как 4-байтовые целые числа должны будут иметь 4 байта в обратном порядке. Если массив содержит только одно целое число, то обратное действие элементов будет работать. Если нет, вам нужно будет обрабатывать каждый отдельный объект, содержащийся в массиве, отдельно.

Mono.DataConvert - это библиотека, которая может помочь здесь, если вы знаете, какие сегменты массива должны рассматриваться как тип данных. Я настоятельно рекомендую проверить эту библиотеку; Я использую его в нескольких проектах, и это довольно изящно. Он даже лицензирован MIT и содержится в одном исходном файле, поэтому вы можете просто скомпилировать его непосредственно в любую сборку, которую вы строите.

+0

Хммм, спасибо за подсказку Mono.DataConvert! –

+0

Привет, cdhowie, я видел Mono.DataConvert, но не знаю, как его применять. По сути, массив содержит все, что читается в файле журнала, либо в окнах, либо в Mono, в другой системе. Я не гарантирую, что все, что читается, - это единственный конечный формат (по умолчанию для Windows) для всех читателей журналов, где он когда-либо находится или читается. –

+0

Не зная формата этого файла журнала, вы ничего не можете сделать. – cdhowie

0

Вы хотите изменить элементы массива или значение самих байтов? Если только массив, то вы можете использовать Array.Reverse()

2

Хм, я думаю, здесь есть проблема. Массив байтов редко по своей природе является большим эндиантом или маленьким концом. Байт почти всегда независим от конца. То, что вы, вероятно, хотите, - это исправить консистенцию целых чисел, символов и т. Д., Содержащихся в массиве байтов.

Для этого вы должны сначала определить байты, которые составляют указанное целое число, char и т. Д., А затем перевернуть эти байты. Просто листать/назад весь массив не может работать (если весь массив не представляет собой одно целое число, символ и т.д.)

Используйте следующие перегрузки метода 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

Вы можете найти рабочую скрипку здесь: Little Endian to Big Endian

Смежные вопросы