Browse Source

Исправлена ошибка в чтении блоков, добавлен запрос сырых бинарных данных, добавлен параметр seek

master v0.1.3
FedorSarafanov 3 years ago
parent
commit
f20bf97c5d
  1. 2
      setup.py
  2. 22
      src/main.cpp
  3. BIN
      tests/test.bin
  4. 15
      tests/test.py
  5. BIN
      tests/test2.bin

2
setup.py

@ -6,7 +6,7 @@ from pybind11 import get_cmake_dir
from pybind11.setup_helpers import Pybind11Extension, build_ext from pybind11.setup_helpers import Pybind11Extension, build_ext
from setuptools import setup from setuptools import setup
__version__ = "0.1.2" __version__ = "0.1.3"
ext_modules = [ ext_modules = [
Pybind11Extension( Pybind11Extension(

22
src/main.cpp

@ -3,9 +3,14 @@
#include <pybind11/stl.h> #include <pybind11/stl.h>
#include <vector> #include <vector>
#include <fstream> #include <fstream>
#include <iostream>
#include <ctime> #include <ctime>
#include <cmath> #include <cmath>
#include "stormpci.h" #include "stormpci.h"
#include "string.h"
namespace py = pybind11;
#define STRINGIFY(x) #x #define STRINGIFY(x) #x
#define MACRO_STRINGIFY(x) STRINGIFY(x) #define MACRO_STRINGIFY(x) STRINGIFY(x)
@ -43,10 +48,12 @@ double distance(double lat1, double lon1, double lat2, double lon2)
class BlockReader class BlockReader
{ {
public: public:
BlockReader(const std::string &fn){ BlockReader(const std::string &fn, long int seek_position){
f = std::ifstream(fn, std::fstream::binary); f = std::ifstream(fn, std::fstream::binary);
pos = seek_position;
} }
BlockBinary& read_block(){ BlockBinary& read_block(){
f.seekg(pos);
f.read(reinterpret_cast<char*>(&_single_block), sizeof(BlockBinary)); f.read(reinterpret_cast<char*>(&_single_block), sizeof(BlockBinary));
if (not f){ if (not f){
throw; throw;
@ -56,13 +63,16 @@ public:
return _single_block; return _single_block;
} }
std::vector<BlockBinary>& read_all_blocks(){ std::vector<BlockBinary>& read_all_blocks(){
f.seekg(pos);
bool read_successfully = true; bool read_successfully = true;
while (read_successfully){ while (read_successfully){
f.read(reinterpret_cast<char*>(&_single_block), sizeof(BlockBinary)); f.read(reinterpret_cast<char*>(&_single_block), sizeof(BlockBinary));
if (not f){ if (f) {
_blocks_vector.push_back(_single_block);
pos += sizeof(BlockBinary);
} else {
read_successfully = false; read_successfully = false;
} }
_blocks_vector.push_back(_single_block);
} }
return _blocks_vector; return _blocks_vector;
} }
@ -76,7 +86,6 @@ private:
std::vector<BlockBinary> _blocks_vector; std::vector<BlockBinary> _blocks_vector;
}; };
namespace py = pybind11;
PYBIND11_MODULE(stormpci_bin_reader, m) { PYBIND11_MODULE(stormpci_bin_reader, m) {
m.doc() = R"pbdoc( m.doc() = R"pbdoc(
@ -92,7 +101,7 @@ PYBIND11_MODULE(stormpci_bin_reader, m) {
py::class_<BlockReader>(m, "BlockReader") py::class_<BlockReader>(m, "BlockReader")
.def(py::init<const std::string &>()) .def(py::init<const std::string &, long int>(), py::arg("fn"), py::arg("seek")=int(0))
.def("read_block", &BlockReader::read_block) .def("read_block", &BlockReader::read_block)
.def("read_all_blocks", &BlockReader::read_all_blocks); .def("read_all_blocks", &BlockReader::read_all_blocks);
@ -100,6 +109,9 @@ PYBIND11_MODULE(stormpci_bin_reader, m) {
.def_readonly("strike", &BlockBinary::strike) .def_readonly("strike", &BlockBinary::strike)
.def_readonly("device_id", &BlockBinary::device_id) .def_readonly("device_id", &BlockBinary::device_id)
.def_readonly("experiment_id", &BlockBinary::experiment_id) .def_readonly("experiment_id", &BlockBinary::experiment_id)
.def_property_readonly("raw_data", [](const BlockBinary bb) {
return py::bytes(reinterpret_cast<const char*>(&bb), sizeof(bb));
})
.def("__repr__", .def("__repr__",
[](const BlockBinary &bb) { [](const BlockBinary &bb) {
std::stringstream stream; std::stringstream stream;

BIN
tests/test.bin

Binary file not shown.

15
tests/test.py

@ -1,7 +1,18 @@
from stormpci_bin_reader import BlockReader from stormpci_bin_reader import BlockReader
br = BlockReader("2022-04-23-00:00:37.bin") br = BlockReader("2022-04-23-00:00:37.bin", seek=0)
blocks = br.read_all_blocks() blocks = br.read_all_blocks()
for block in blocks: # print(len(blocks))
for j, block in enumerate(blocks):
if j == 0:
# print(len(block.raw_data))
with open("test.bin", "wb") as f:
f.write(block.raw_data)
print(block) print(block)
# for tests run in bash:
# head -c 6344 2022-04-23-00\:00\:37.bin > test2.bin
# and
# diff test2.bin test.bin

BIN
tests/test2.bin

Binary file not shown.
Loading…
Cancel
Save