Skip to content

Commit

Permalink
Fix SerializeArray error when swaping the bytes (#126)
Browse files Browse the repository at this point in the history
* Fix SerializeArray error when swaping the bytes

Signed-off-by: wangjinqian <[email protected]>

* Enable both big-endian and little-endian unitest

Signed-off-by: wangjinqian <[email protected]>

* Fix wstring serialize error when swaping the bytes

Signed-off-by: wangjinqian <[email protected]>

Signed-off-by: wangjinqian <[email protected]>
Co-authored-by: wangjinqian <[email protected]>
  • Loading branch information
wjswjq and wangjinqian authored Sep 2, 2022
1 parent da29872 commit fe52263
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 12 deletions.
32 changes: 24 additions & 8 deletions src/cpp/Cdr.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -765,8 +765,24 @@ Cdr& Cdr::serialize(
#if defined(_WIN32)
serializeArray(string_t, wstrlen);
#else
m_currentPosition.memcopy(string_t, bytesLength);
m_currentPosition += bytesLength; // size on bytes
if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(string_t);
const char* end = dst + bytesLength;

for (; dst < end; dst += sizeof(*string_t))
{
m_currentPosition++ << dst[3];
m_currentPosition++ << dst[2];
m_currentPosition++ << dst[1];
m_currentPosition++ << dst[0];
}
}
else
{
m_currentPosition.memcopy(string_t, bytesLength);
m_currentPosition += bytesLength; // size on bytes
}
#endif // if defined(_WIN32)
}
else
Expand Down Expand Up @@ -898,7 +914,7 @@ Cdr& Cdr::serializeArray(

if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&short_t);
const char* dst = reinterpret_cast<const char*>(short_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*short_t))
Expand Down Expand Up @@ -967,7 +983,7 @@ Cdr& Cdr::serializeArray(

if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&long_t);
const char* dst = reinterpret_cast<const char*>(long_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*long_t))
Expand Down Expand Up @@ -1076,7 +1092,7 @@ Cdr& Cdr::serializeArray(

if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&longlong_t);
const char* dst = reinterpret_cast<const char*>(longlong_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*longlong_t))
Expand Down Expand Up @@ -1151,7 +1167,7 @@ Cdr& Cdr::serializeArray(

if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&float_t);
const char* dst = reinterpret_cast<const char*>(float_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*float_t))
Expand Down Expand Up @@ -1222,7 +1238,7 @@ Cdr& Cdr::serializeArray(

if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&double_t);
const char* dst = reinterpret_cast<const char*>(double_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*double_t))
Expand Down Expand Up @@ -1334,7 +1350,7 @@ Cdr& Cdr::serializeArray(
#if FASTCDR_SIZEOF_LONG_DOUBLE == 8 || FASTCDR_SIZEOF_LONG_DOUBLE == 16
if (m_swapBytes)
{
const char* dst = reinterpret_cast<const char*>(&ldouble_t);
const char* dst = reinterpret_cast<const char*>(ldouble_t);
const char* end = dst + totalSize;

for (; dst < end; dst += sizeof(*ldouble_t))
Expand Down
41 changes: 37 additions & 4 deletions test/SimpleTest.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -241,14 +241,31 @@ static void check_good_case(
// Serialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_ser(cdrbuffer);
Cdr cdr_ser(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::LITTLE_ENDIANNESS);
EXPECT_NO_THROW(cdr_ser << input_value);
}

// Deserialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_des(cdrbuffer);
Cdr cdr_des(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::LITTLE_ENDIANNESS);
T output_value{};

EXPECT_NO_THROW(cdr_des >> output_value);
EXPECT_EQ(output_value, input_value);
}

// Serialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_ser(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::BIG_ENDIANNESS);
EXPECT_NO_THROW(cdr_ser << input_value);
}

// Deserialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_des(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::BIG_ENDIANNESS);
T output_value{};

EXPECT_NO_THROW(cdr_des >> output_value);
Expand Down Expand Up @@ -291,14 +308,30 @@ static void check_good_case_array(
// Serialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_ser(cdrbuffer);
Cdr cdr_ser(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::LITTLE_ENDIANNESS);
EXPECT_NO_THROW(cdr_ser.serializeArray(input_value, N));
}

// Deserialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_des(cdrbuffer);
Cdr cdr_des(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::LITTLE_ENDIANNESS);
T output_value[N];

EXPECT_NO_THROW(cdr_des.deserializeArray(output_value, N));
EXPECT_ARRAY_EQ(output_value, input_value, N);
}
// Serialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_ser(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::BIG_ENDIANNESS);
EXPECT_NO_THROW(cdr_ser.serializeArray(input_value, N));
}

// Deserialization.
{
FastBuffer cdrbuffer(buffer, BUFFER_LENGTH);
Cdr cdr_des(cdrbuffer, eprosima::fastcdr::Cdr::Endianness::BIG_ENDIANNESS);
T output_value[N];

EXPECT_NO_THROW(cdr_des.deserializeArray(output_value, N));
Expand Down

0 comments on commit fe52263

Please sign in to comment.