Найдите составное местоположение на экране

Предполагая, что обе системы, 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 .

8
задан ThinkingStiff 27 July 2012 в 07:54
поделиться

1 ответ

Я верю методу, 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();
    }
}
16
ответ дан 5 December 2019 в 10:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: