Я конвертирую длинный в массив из 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];
Всякий раз, когда вы отправляете данные по сети, вы должен разум порядок байт
В вашем случае, похоже, что правильный способ воссоздать long из байтового массива — восстановить его справа налево:
long fileLength = 0;
for( int i=7; i >= 0; i--)
fileLength = (fileLength << 8) + Data[i];
Но это не всегда так. В зависимости от аппаратного обеспечения и операционной системы в конечных точках, а также от используемых вами сетевых протоколов передачи, у вас могут быть данные, поступающие в формате с прямым или обратным порядком байтов, а принимающая сторона может быть с прямым или младшим порядком байтов.
От документация:
Порядок байтов в массиве, возвращаемый методом GetBytes, зависит от того, является ли архитектура компьютера прямым или старшим.
Похоже, на вашем оборудовании массив отправляется с его младшими байтами в первую очередь. Следовательно, вы должны начать цикл с конца массива:
int64_t fileLenth = 0;
for( int i=7;i >= 0; --i)
fileLenght = (fileLenght << 8) + Data[i];
Demo. (отпечатки 172085)
Для достижения лучшей совместимости с C # вы должны использовать системно-независимый 64-битный интегральный тип вместо long
т.е. int64_t
,
Если оба конца имеют одинаковый порядок байтов (C # всегда имеет младший порядок, вероятно, ваш C ++ также):
long long fileLength;
memcpy(&fileLength, Data, 8);
Оптимизирующий компилятор почти наверняка превратит это в один 64-битный шаг, так что не беспокойтесь, что это похоже на дорогой вызов функции.