Создание файла.ov2 с помощью Java
Я пытаюсь выяснить, как создать файл.ov2 для добавления данных POI на устройство TomTom GPS. Формат данных должен быть следующим:
Файл OV2 состоит из записей POI. Каждая запись имеет следующий формат данных.
- 1 байт, символ, статус POI ("0" или "2")
- 4 байта, long, обозначает длину записи POI.
- 4 байта, долгота, долгота * 100000
- 4 байта, длинные, широта * 100000
- x БАЙТЫ, строка, метка для POI, x =3D= общая длина 3D =96 (1 + 3 * 4)
- Завершающий нулевой байт.
Я нашел следующий код PHP, который должен принимать файл.csv, проходить по нему построчно, разбивать каждую запись и затем записывать ее в новый файл в правильном формате. Я надеялся, что кто-нибудь сможет помочь мне перевести это на Java. Мне действительно нужна только линия, которую я пометил стрелкой "--->". Я вообще не знаю PHP, но все, кроме этой одной строки, достаточно основательно, чтобы я мог взглянуть на него и перевести его, но я не знаю, что функции PHP делают в этой одной строке. Даже если бы кто-то мог объяснить это достаточно хорошо, тогда, возможно, я мог бы понять это на Java. Если вы можете перевести это напрямую, пожалуйста, сделайте, но даже объяснение было бы полезно. Благодарю.
<?php
$csv = file("File.csv");
$nbcsv = count($csv);
$file = "POI.ov2";
$fp = fopen($file, "w");
for ($i = 0; $i < $nbcsv; $i++) {
$table = split(",", chop($csv[$i]));
$lon = $table[0];
$lat = $table[1];
$des = $table[2];
--->$TT = chr(0x02).pack("V",strlen($des)+14).pack("V",round($lon*100000)).pack("V",round($lat*100000)).$des.chr(0x00);
@fwrite($fp, "$TT");
}
fclose($fp);
?>
2 ответа
Загрузите файл в массив, где каждый элемент является строкой из файла.
$csv = file("File.csv");
Подсчитайте количество элементов в массиве.
$nbcsv = count($csv);
Откройте выходной файл для записи.
$file = "POI.ov2";
$fp = fopen($file, "w");
В то время как $i
<количество элементов массива, $i++
for ($i = 0; $i < $nbcsv; $i++) {
Обрежьте строку справа (удалите все пробелы) и разделите строку на ','. $table
массив значений из строки csv
$table = split(",", chop($csv[$i]));
Присвойте составные части таблицы их собственным переменным по числовому индексу.
$lon = $table[0];
$lat = $table[1];
$des = $table[2];
Хитрый бит.
chr (02) буквально код символа 2.pack
это двоичная функция обработки Требуется формат и некоторые данные.V
= unsigned long (всегда 32-битный, байтовый порядок с прямым порядком байтов).
Я уверен, что вы можете обработать математические биты, но вам нужно преобразовать их в 32-битные значения порядка байтов.
.
является оператором строки string
Наконец это заканчивается с помощью chr(0). Нулевой символ
$TT = chr(0x02).
pack("V",strlen($des)+14).
pack("V",round($lon*100000)).
pack("V",round($lat*100000)).
$des.chr(0x00);
Запишите это и закройте файл.
@fwrite($fp, "$TT");
}
fclose($fp);
Ключом в JAVA является применение правильного порядка байтов ByteOrder.LITTLE_ENDIAN к ByteBuffer.
Вся функция:
private static boolean getWaypoints(ArrayList<Waypoint> geopoints, File f)
{
try{
FileOutputStream fs = new FileOutputStream(f);
for (int i=0;i<geopoints.size();i++)
{
fs.write((byte)0x02);
String desc = geopoints.get(i).getName();
int poiLength = desc.toString().length()+14;
fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(poiLength).array());
int lon = (int)Math.round((geopoints.get(i).getLongitudeE6()/1E6)*100000);
fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(lon).array());
int lat = (int)Math.round((geopoints.get(i).getLatitudeE6()/1E6)*100000);
fs.write(ByteBuffer.allocate(4).order(ByteOrder.LITTLE_ENDIAN).putInt(lat).array());
fs.write(desc.toString().getBytes());
fs.write((byte)0x00);
}
fs.close();
return true;
}
catch (Exception e)
{
return false;
}
}