Как преобразовать массив байтов в uint64 и обратно в С#?

Я пробовал это давно. У меня есть массив байтов, который я хочу преобразовать в ulong и вернуть значение другой функции, и эта функция должна вернуть значения байтов.

Я пробовал битовый сдвиг, но в нескольких случаях это было безуспешно. Есть ли альтернатива битрейту? или у вас есть короткий пример? Спасибо за помощь.

Вот код битового сдвига, который я использовал, я не понимаю, почему вторая запись не 00000001:

using System;
using System.Text;


namespace ConsoleApplication1
{
class Program
{
    static void Main(string[] args)
    {

         int[]responseBuffer = {0,1,2,3,4,5};


        UInt64 my = (UInt64)(((UInt64)(((responseBuffer[0]) << 40) & 0xFF0000000000)) |
              (UInt64)(((responseBuffer[1]) << 32) & 0x00FF00000000) |
              (UInt64)(((responseBuffer[2]) << 24) & 0x0000FF000000) |
              (UInt64)(((responseBuffer[3]) << 16) & 0x000000FF0000) |
               (UInt64)(((responseBuffer[4]) << 8) & 0x00000000FF00) | 
               (UInt64)(responseBuffer[5] & 0xFF));

         UInt64[] m_buffer = {(UInt64)((my >> 40) & 0xff),
                             (UInt64)((my >> 33) & 0xff) ,
                             (UInt64)((my >> 24) & 0xff) ,
                             (UInt64)((my>> 16) & 0xff) ,
                             (UInt64)((my>> 8) & 0xff) ,
                             (UInt64)(my& 0xff)};

         Console.WriteLine("" + m_buffer[1]);

            //string m_s = "";
            StringBuilder sb = new StringBuilder();
            for (int k = 0; k < 6; k++)
            {
                int value = (int)m_buffer[k];
                for (int i = 7; i >= 0; i--)
                {
                    if ((value >> i & 0x1) > 0)
                    {
                        sb.Append("1");
                        value &= (Byte)~(0x1 << i);
                    }
                    else
                        sb.Append("0");
                }
                sb.Append(" ");
            }   
                  Console.WriteLine(sb.ToString());
                  Console.Read();
    }
}

}


person Vikyboss    schedule 23.09.2011    source источник
comment
не могли бы вы опубликовать свою функцию битового сдвига? Мы могли бы помочь разобраться.   -  person arviman    schedule 23.09.2011
comment
Но все еще не уверен, что не так с моим битрейтом.   -  person Vikyboss    schedule 23.09.2011
comment
пожалуйста, посмотрите мой ответ. Кроме того, почему вы смещаете вправо на 33 для второго элемента в буфере ответов.   -  person arviman    schedule 23.09.2011
comment
@Vikyboss: вам нужно произнести перед сдвигом влево.   -  person Ben Voigt    schedule 23.09.2011


Ответы (2)


Во-первых, я бы выяснил, что пошло не так с битрейтингом, на случай, если он вам когда-нибудь снова понадобится. Он должен работать нормально.

Во-вторых, есть альтернатива с BitConverter.ToUInt64 и BitConverter.GetBytes(ulong), если вы довольны порядком байтов в системе.

Если вы хотите указать порядок байтов, у меня есть класс EndianBitConverter в моей библиотеке MiscUtil. которые вы могли бы использовать.

(Если вам просто нужно, чтобы он был обратимым на машине того же типа, я бы придерживался встроенной.)

person Jon Skeet    schedule 23.09.2011
comment
Что такое EndianBitCONverter? Есть ли пример для класса BitConverter? Поиск хорошего для преобразования байтового массива. - person Vikyboss; 23.09.2011
comment
@Vikyboss: EndianBitConverter похож на BitConverter, но позволяет вам контролировать порядок следования байтов. - person Jon Skeet; 23.09.2011

Я не уверен, в чем смысл левого и правого битового сдвига, который вы делаете изначально (я предполагаю, что вы пытаетесь сгенерировать значения Uint64 для проверки своей функции). Чтобы исправить свою функцию, просто приведите числа к UInt64, а затем проверьте их. В качестве альтернативы вы можете создавать длинные литералы, используя суффикс l. например UInt64[] responseBuffer = {0l,1l};

        static void Main(string[] args)
        {

            int[] responseBuffer = { 0, 1, 2, 3, 4, 5 };
            List<UInt64> bufferList = new List<ulong>();
            foreach (var r in responseBuffer)
                bufferList.Add((UInt64)r);

            UInt64[] m_buffer = bufferList.ToArray();
            foreach (var item in m_buffer)
                Console.WriteLine(item);

            //string m_s = "";
            StringBuilder sb = new StringBuilder();
            for (int k = 0; k < m_buffer.Length; k++)
            {
                int value = (int)m_buffer[k];
                for (int i = 7; i >= 0; i--)
                {
                    if ((value >> i & 0x1) > 0)
                    {
                        sb.Append("1");
                        value &= (Byte)~(0x1 << i);
                    }
                    else
                        sb.Append("0");
                }
                sb.Append(" ");
            }
            Console.WriteLine(sb.ToString());
       }
person arviman    schedule 23.09.2011
comment
Я делал направо и налево, чтобы показать, как создается элемент типа uint64. Но создание производится в отдельной программе. Спасибо за помощь. - person Vikyboss; 24.09.2011