Создание файла.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;
}


}
Другие вопросы по тегам