From ff16782fb7421d1af8120d5f519bc1b4e6453e71 Mon Sep 17 00:00:00 2001 From: Jochen Topf Date: Mon, 23 Jul 2018 16:36:34 +0200 Subject: [PATCH] Rewrite code to be byte-order independent. Fixes #263. --- include/osmium/io/detail/pbf_input_format.hpp | 15 ++++++++------- include/osmium/io/detail/pbf_output_format.hpp | 14 ++++++++------ 2 files changed, 16 insertions(+), 13 deletions(-) diff --git a/include/osmium/io/detail/pbf_input_format.hpp b/include/osmium/io/detail/pbf_input_format.hpp index 0f1ca22df..e146dd776 100644 --- a/include/osmium/io/detail/pbf_input_format.hpp +++ b/include/osmium/io/detail/pbf_input_format.hpp @@ -44,7 +44,6 @@ DEALINGS IN THE SOFTWARE. #include #include -#include #include #include @@ -97,18 +96,20 @@ namespace osmium { * the length of the following BlobHeader. */ uint32_t read_blob_header_size_from_file() { - uint32_t size_in_network_byte_order; + uint32_t size; try { - const std::string input_data{read_from_input_queue(sizeof(size_in_network_byte_order))}; - size_in_network_byte_order = *reinterpret_cast(input_data.data()); + // size is encoded in network byte order + const std::string input_data{read_from_input_queue(sizeof(size))}; + const char* d = input_data.data(); + size = (static_cast(d[3])) | + (static_cast(d[2]) << 8u) | + (static_cast(d[1]) << 16u) | + (static_cast(d[0]) << 24u); } catch (const osmium::pbf_error&) { return 0; // EOF } - uint32_t size = size_in_network_byte_order; - ::protozero::byteswap_inplace(&size); - if (size > static_cast(max_blob_header_size)) { throw osmium::pbf_error{"invalid BlobHeader size (> max_blob_header_size)"}; } diff --git a/include/osmium/io/detail/pbf_output_format.hpp b/include/osmium/io/detail/pbf_output_format.hpp index 4239667a1..4af7134a3 100644 --- a/include/osmium/io/detail/pbf_output_format.hpp +++ b/include/osmium/io/detail/pbf_output_format.hpp @@ -62,7 +62,6 @@ DEALINGS IN THE SOFTWARE. #include #include -#include #include #include #include @@ -193,13 +192,16 @@ namespace osmium { // data plus a few header bytes (https://zlib.net/zlib_tech.html). pbf_blob_header.add_int32(FileFormat::BlobHeader::required_int32_datasize, static_cast(blob_data.size())); - auto sz = static_cast(blob_header_data.size()); - ::protozero::byteswap_inplace(&sz); + const auto size = static_cast(blob_header_data.size()); - // write to output: the 4-byte BlobHeader-Size followed by the BlobHeader followed by the Blob + // write to output: the 4-byte BlobHeader size in network + // byte order followed by the BlobHeader followed by the Blob std::string output; - output.reserve(sizeof(sz) + blob_header_data.size() + blob_data.size()); - output.append(reinterpret_cast(&sz), sizeof(sz)); + output.reserve(4 + blob_header_data.size() + blob_data.size()); + output += static_cast((size >> 24u) & 0xffu); + output += static_cast((size >> 16u) & 0xffu); + output += static_cast((size >> 8u) & 0xffu); + output += static_cast( size & 0xffu); output.append(blob_header_data); output.append(blob_data);