diff --git a/Doc/changelog.docu b/Doc/changelog.docu
index f3c542e1..f336bf26 100644
--- a/Doc/changelog.docu
+++ b/Doc/changelog.docu
@@ -109,6 +109,7 @@
IO
- OMWriter: fix crash in OMWriter when writing an empty mesh with colors
+- Binary writers: Fixed double swap in string specialization. Added Unittest.
VectorT
diff --git a/src/OpenMesh/Core/IO/SR_binary_spec.hh b/src/OpenMesh/Core/IO/SR_binary_spec.hh
index 25e2a1e6..956b6e8f 100644
--- a/src/OpenMesh/Core/IO/SR_binary_spec.hh
+++ b/src/OpenMesh/Core/IO/SR_binary_spec.hh
@@ -238,8 +238,6 @@ template <> struct binary< std::string > {
{
length_t len = length_t(_v.size());
- if (_swap) reverse_byte_order(len);
-
size_t bytes = binary::store( _os, len, _swap );
_os.write( _v.data(), len );
return _os.good() ? len+bytes : 0;
@@ -252,8 +250,6 @@ template <> struct binary< std::string > {
{
length_t len;
size_t bytes = binary::restore( _is, len, _swap );
- if (_swap)
- reverse_byte_order(len);
_val.resize(len);
_is.read( const_cast(_val.data()), len );
diff --git a/src/Unittests/unittests_sr_binary.cc b/src/Unittests/unittests_sr_binary.cc
new file mode 100644
index 00000000..36115d86
--- /dev/null
+++ b/src/Unittests/unittests_sr_binary.cc
@@ -0,0 +1,88 @@
+#include
+#include
+#include
+#include
+#include
+
+
+namespace {
+
+class OpenMeshSRBinary : public testing::Test {
+
+ protected:
+
+ // This function is called before each test is run
+ virtual void SetUp() {
+
+ // Do some initial stuff with the member data here...
+ }
+
+ // This function is called after all tests are through
+ virtual void TearDown() {
+
+ // Do some final stuff with the member data here...
+ }
+
+};
+
+
+
+/*
+ * ====================================================================
+ * Define tests below
+ * ====================================================================
+ */
+
+/* Check if len is swapped correctly
+ * when storing strings using the binary serializer.
+ *
+ */
+TEST_F(OpenMeshSRBinary, CheckStringSwap) {
+ std::string testString = "OpenMesh String";
+ std::stringstream stream("");
+ OpenMesh::IO::binary::store(stream,testString,true);
+ std::stringstream stream2("");
+ OpenMesh::IO::binary::store(stream2,testString,false);
+ std::string res2 = stream2.str();
+ std::string res = stream.str();
+ uint16_t len, len2;
+ stream.read((char*)&len,2);
+
+ stream2.read( (char*)&len2,2);
+
+ EXPECT_EQ(len2,testString.length());
+ EXPECT_EQ(len,(testString.length()>>8)|(testString.length()<<8));
+ EXPECT_NE(len,len2);
+}
+
+/* Check if storing and restoring a string gives proper result
+ * Do that with and without swapping the byte order
+ */
+TEST_F(OpenMeshSRBinary, StringStoreRestore) {
+
+
+ std::string testString = "OpenMesh String";
+ std::stringstream stream("");
+ OpenMesh::IO::binary::store(stream,testString,true);
+ std::stringstream stream2("");
+ OpenMesh::IO::binary::store(stream2,testString,false);
+
+
+ std::string restored1, restored2;
+ OpenMesh::IO::binary::restore(stream, restored1 , true);
+ OpenMesh::IO::binary::restore(stream2, restored2 , false);
+
+ EXPECT_EQ(restored1.length(), restored2.length());
+ EXPECT_EQ(restored1.length(), testString.length());
+ for(size_t i = 0 ; i < testString.length() ; ++i)
+ {
+ EXPECT_EQ(restored1[i] , testString[i]);
+ EXPECT_EQ(restored2[i] , testString[i]);
+ }
+
+
+}
+
+
+
+}