Я пытаюсь прочитать big-endian 8 32-битных поплавков, передаваемых из упакованной структуры на поточном сервере Python tcp. Кажется, что он близок к работе, но первые несколько значений отключены нечетным количеством, а более поздние значения кажутся небольшими или просто неточными.Чтение поплавков с tcp
Например, эти значения интерпретируются клиентом:
Val[0] -1926.34
Val[1] -1936.86
Val[2] -1901.15
Val[3] -1935.93
Val[4] -148932
Val[5] -145905
Val[6] -41580.8
Val[7] -134330
И вот (близко, но сейчас достаточно) значения они должны быть. Это не совсем реальные, потому что трудно поймать тот же пакет на сервере и клиенте.
Val[0] -7737.77159902711
Val[1] -7746.444075875769
Val[2] -7638.46279841218
Val[3] -7776.037785534595
Val[4] -148935.79768369172
Val[5] -145903.3365134402
Val[6] -41594.9200504923
Val[7] -134328.9103304041
Вот мой код:
int size = 32;
char buffer[size];
float vals[8];
int count = 0;
int t;
// Receive a reply from the server
if (recv(sock, buffer, size, 0) < 0) {std::cout << "Receive failed..." << std::endl;}
for (int i = 0; count < 8; i += 4, count++) {
t =
(buffer[i+3]) +
(buffer[i+2] << 8) +
(buffer[i+1] << 16) +
(buffer[i] << 24);
vals[count] = *reinterpret_cast<float*>(&t);
}
Сервер Python посылает пакет:
packer = struct.Struct('>%sf' % 8)
packed_data = packer.pack(*values)
sock.send(packed_data)
У меня есть чувство, что это может быть проблемой, о преобразовании между Int и плавать, но Кажется, я не понимаю. Любая помощь приветствуется.
Если у вас есть к нему доступ, было бы полезно, если бы вы могли добавить фрагмент Python, который отправляет данные. – icktoofay
Спасибо, я добавлю. – jay
Это не безопасный способ чтения данных: ваш буфер может быть недостаточно выровнен для '* reinterpret_cast (& t)' доступ не к SIGBUS на некоторых архитектурах. Было бы лучше «recv» непосредственно в/над массивом 'vals', используя, например, ['ntohl'] (http://linux.die.net/man/3/ntohl) и др. для окончательных преобразований, если это необходимо. Отдельно TCP не гарантирует, что один и тот же объем данных, указанных в вызове 'send', будет поступать сразу в' recv' - вы должны зацикливаться, пока не прочитаете ожидаемое количество байтов или не столкнетесь с ошибкой. –