2013-02-15 4 views
0

Передающего C сторонаКак отправить C++ удваивает из одной системы в другую Sender: Winsock Приемник: Java

double tmp = htonl(anydouble); 
send(socket, (char *) &tmp, sizeof(tmp), 0); 

На стороне Java, IM чтения данных сети в полукокс [8]

Каков правильный способ преобразования в двойное? Разве это путь, чтобы просто отправить строку и разобрать ее, чтобы удвоить?

ответ

1

Я бы посоветовал использовать Google протокола Буферы: https://developers.google.com/protocol-buffers/docs/overview имеет библиотеки для C и Java и многих других языков, как, например, Python, который вы можете найти полезные позже. Он эффективный, надежный, будет заботиться о контенте и т. Д.

3

Это должно сработать.

char[] sentDouble = readBytes(); // get your bytes char[8] 
String asString = new String(sentDouble); // make a string out of it 
double myDouble = Double.parseDouble(asString); // parse it into a double 

С байт [] вы можете сделать

import java.nio.ByteBuffer; 

public static double toDouble(byte[] bytes) { 
    return ByteBuffer.wrap(bytes).getDouble(); 
} 
+0

Это псевдокод, очевидно, , У меня нет метода readbytes(). 'Doube.parseDouble()' выдает исключение, поймайте его. –

+0

Возможно, это сработает, если я отправил двойник в удобочитаемой форме в виде строки, но не отправил «plain» 64Bit. – Simbi

+0

Двойной 8 байт, поэтому вам понадобится байт [8] или char [4]. С байтом [8] вы можете использовать то, что я редактировал в своем ответе. –

0

Нет необходимости в String накладных расходов. Сначала соберите байты в long, затем используйте метод Double's static longBitsToDouble.

// The bit pattern for the double "1.0", assuming most signficant bit first in array. 
char[] charArray = new char[] {0x3F, 0xF0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}; 
long bytesAsLong = 0L; 
for (int i = 0; i < 8; i++) 
{ 
    bytesAsLong |= ((long) charArray[i] << (56 - 8*i)); 
} 
double value = Double.longBitsToDouble(bytesAsLong); 
System.out.println(value); // prints "1.0" 
1

Вы переосмысливаете двойной как длинный. Это не будет переносимым. Вот несколько альтернатив:

  • действительно ли вам нужно использовать значения с плавающей запятой? Можете ли вы представить свои значения как целые числа (например, миллисекунды вместо секунд)?
  • закодировать двойной в виде строки (например, Sprintf и Double.parseDouble)
  • экстракт мантиссу и экспоненту с frexp и отправить в виде целых чисел, а затем преобразовать обратно в Java с Double.longBitsToDouble

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

  • Нет связанных вопросов^_^