8-байтовый массив обратно в long (от C # до c ++)

Я конвертирую длинный в массив из 8 слотов с помощью C #

Byte[] Data = BitConverter.GetBytes(data.LongLength);

Например, если data.LongLenght 172085, я получаю следующий массив {53,160,2,0,0,0,0,0}
Но потом, после того, как я отправлю это на свой c ++ сервер, я бы хотел снова получить его долго.

Я попробовал это, но безуспешно …

long fileLenght = 0;
for( int i=0;i < 8; ++i)
fileLenght = (fileLenght << 8) + Data[i];

1

Решение

Всякий раз, когда вы отправляете данные по сети, вы должен разум порядок байт

В вашем случае, похоже, что правильный способ воссоздать long из байтового массива — восстановить его справа налево:

long fileLength = 0;
for( int i=7; i >= 0; i--)
fileLength = (fileLength << 8) + Data[i];

Но это не всегда так. В зависимости от аппаратного обеспечения и операционной системы в конечных точках, а также от используемых вами сетевых протоколов передачи, у вас могут быть данные, поступающие в формате с прямым или обратным порядком байтов, а принимающая сторона может быть с прямым или младшим порядком байтов.

1

Другие решения

От документация:

Порядок байтов в массиве, возвращаемый методом GetBytes, зависит от того, является ли архитектура компьютера прямым или старшим.

Похоже, на вашем оборудовании массив отправляется с его младшими байтами в первую очередь. Следовательно, вы должны начать цикл с конца массива:

int64_t fileLenth = 0;
for( int i=7;i >= 0; --i)
fileLenght = (fileLenght << 8) + Data[i];

Demo. (отпечатки 172085)

Для достижения лучшей совместимости с C # вы должны использовать системно-независимый 64-битный интегральный тип вместо longт.е. int64_t,

1

Если оба конца имеют одинаковый порядок байтов (C # всегда имеет младший порядок, вероятно, ваш C ++ также):

long long fileLength;
memcpy(&fileLength, Data, 8);

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

0