Предполагая, что обе системы, windows и android, являются прямым порядком байтов, что часто встречается в процессорах ARM и x86 / x64, вы можете сделать следующее.
Во-первых: Определите тип с индивидуальным размером, так что либо double, с 64-битным, float с 32-битным, либо uint64 / 32/16 или int64 / 32/16. НЕ используйте такие вещи, как int
или long
, чтобы определить тип данных.
Второе: используйте следующий метод для записи двоичных данных:
std::vector myVec;
std::ofstream f("outputFile.bin", std::ios::binary);
f.write(reinterpret_cast(myVec.data()), myVec.size()*sizeof(uint64_t));
f.close();
В этом случае вы берете необработанные данные и записываете их двоичный формат в файл.
Теперь на другом компьютере убедитесь, что тип данных, который вы используете, имеет такой же размер типа и тот же порядок байтов . Если оба одинаковы, вы можете сделать это:
std::vector myVec(sizeOfTheData);
std::ifstream f("outputFile.bin", std::ios::binary);
f.read(reinterpret_cast(&myVec.front()), myVec.size()*sizeof(uint64_t));
f.close();
Обратите внимание, что вы должны знать размер данных перед их чтением.
Примечание: этот код у меня в голове. Я не проверял это, но оно должно работать.
Теперь, если целевая система не имеет такой же порядковый номер, вы должны прочитать данные в пакетном режиме, перевернуть порядковый номер, а затем поместить их в свой вектор. Как перевернуть порядковый номер подробно обсуждался здесь .
Чтобы определить порядковый номер вашей системы, это обсуждалось здесь .
Штраф за производительность будет пропорционален разнице этих систем. Если они оба имеют одинаковый порядок байтов и вы выбираете один и тот же тип данных и размер, у вас все хорошо и у вас оптимальная производительность. В противном случае у вас будет штраф в зависимости от того, сколько конвертации вам нужно сделать. Это самое быстрое, что вы можете получить.
Примечание из комментариев: Если вы переносите удвоения или числа с плавающей запятой, убедитесь, что обе системы используют стандарт IEEE 754. Очень часто они используются, не просто порядком байтов, а просто для уверенности.
Теперь, если эти решения вам не подходят, вам нужно использовать подходящую библиотеку сериализации, чтобы стандартизировать формат для вас. Есть библиотеки, которые могут сделать это, такие как protobuf .
Я верю методу, Control.toDisplay () должен смочь перевести Ваши координаты в относительно экрана.
Этот отрывок может проиллюстрировать то, что Вы после:
package org.eclipse.jface.snippets;
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class Bla {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
final Text t = new Text(shell,SWT.BORDER);
t.setBounds(new Rectangle(10,10,200,30));
System.err.println(t.toDisplay(1, 1));
Button b = new Button(shell,SWT.PUSH);
b.setText("Show size");
b.setBounds(new Rectangle(220,10,100,20));
b.addSelectionListener(new SelectionAdapter() {
public void widgetSelected(SelectionEvent e) {
System.err.println(t.toDisplay(1, 1));
}
});
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}