Skip to content

Commit 92dc295

Browse files
committed
Fix pad_to_size to work correctly misaligned
1 parent af137bb commit 92dc295

File tree

3 files changed

+70
-18
lines changed

3 files changed

+70
-18
lines changed

include/bitstream/stream/bit_reader.h

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -178,24 +178,23 @@ namespace bitstream
178178

179179
BS_ASSERT(num_bytes * 8U >= m_NumBitsRead);
180180

181-
uint32_t offset = m_NumBitsRead / 32;
181+
uint32_t remainder = (num_bytes * 8U - m_NumBitsRead) % 32U;
182182
uint32_t zero;
183183

184-
// Test for zeros in padding
185-
for (uint32_t i = offset; i < num_bytes / 4; i++)
184+
// Test the last word more carefully, as it may have data
185+
if (remainder != 0U)
186186
{
187-
bool status = serialize_bits(zero, 32);
188-
187+
bool status = serialize_bits(zero, remainder);
189188
BS_ASSERT(status && zero == 0);
190189
}
191190

192-
uint32_t remainder = num_bytes * 8U - m_NumBitsRead;
191+
uint32_t offset = m_NumBitsRead / 32;
192+
uint32_t max = num_bytes / 4;
193193

194-
// Test the last word more carefully, as it may have data
195-
if (remainder % 32U != 0U)
194+
// Test for zeros in padding
195+
for (uint32_t i = offset; i < max; i++)
196196
{
197-
bool status = serialize_bits(zero, remainder);
198-
197+
bool status = serialize_bits(zero, 32);
199198
BS_ASSERT(status && zero == 0);
200199
}
201200

include/bitstream/stream/bit_writer.h

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -214,20 +214,33 @@ namespace bitstream
214214
BS_ASSERT(num_bytes * 8U <= m_TotalBits);
215215

216216
BS_ASSERT(num_bytes * 8U >= m_NumBitsWritten);
217+
218+
if (m_NumBitsWritten == 0)
219+
{
220+
std::memset(m_Buffer, 0, num_bytes);
221+
222+
m_NumBitsWritten = num_bytes * 8;
223+
m_Scratch = 0;
224+
m_ScratchBits = 0;
225+
m_WordIndex = num_bytes / 4;
226+
227+
return true;
228+
}
229+
230+
uint32_t remainder = (num_bytes * 8U - m_NumBitsWritten) % 32U;
231+
uint32_t zero = 0;
232+
233+
// Align to byte
234+
if (remainder != 0U)
235+
BS_ASSERT(serialize_bits(zero, remainder));
217236

218237
uint32_t offset = m_NumBitsWritten / 32;
219-
uint32_t zero = 0;
238+
uint32_t max = num_bytes / 4;
220239

221240
// Serialize words
222-
for (uint32_t i = offset; i < num_bytes / 4; i++)
241+
for (uint32_t i = offset; i < max; i++)
223242
BS_ASSERT(serialize_bits(zero, 32));
224243

225-
uint32_t remainder = num_bytes * 8U - m_NumBitsWritten;
226-
227-
// Align to byte
228-
if (remainder % 32U != 0U)
229-
BS_ASSERT(serialize_bits(zero, remainder));
230-
231244
return true;
232245
}
233246

src/test/stream_test.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,46 @@ namespace bitstream::test::stream
155155
BS_TEST_ASSERT(out_value2 == in_value2);
156156
}
157157

158+
BS_ADD_TEST(test_serialize_padding_empty)
159+
{
160+
// Write some initial value, pad it, and then write another value
161+
byte_buffer<32> buffer;
162+
bit_writer writer(buffer);
163+
BS_TEST_ASSERT(writer.pad_to_size(30));
164+
uint32_t num_bytes = writer.flush();
165+
166+
BS_TEST_ASSERT(num_bytes == 30);
167+
168+
// Read the values and validate padding
169+
bit_reader reader(buffer, num_bytes);
170+
171+
BS_TEST_ASSERT(reader.pad_to_size(30));
172+
}
173+
174+
BS_ADD_TEST(test_serialize_padding_full)
175+
{
176+
// Test padding
177+
uint32_t in_value = 3;
178+
179+
// Write some initial value, pad it, and then write another value
180+
byte_buffer<32> buffer;
181+
bit_writer writer(buffer);
182+
BS_TEST_ASSERT(writer.serialize_bits(in_value, 3));
183+
BS_TEST_ASSERT(writer.pad_to_size(32));
184+
uint32_t num_bytes = writer.flush();
185+
186+
BS_TEST_ASSERT(num_bytes == 32);
187+
188+
// Read the values and validate padding
189+
uint32_t out_value;
190+
bit_reader reader(buffer, num_bytes);
191+
192+
BS_TEST_ASSERT(reader.serialize_bits(out_value, 3));
193+
BS_TEST_ASSERT(reader.pad_to_size(32));
194+
195+
BS_TEST_ASSERT(out_value == in_value);
196+
}
197+
158198
void test_serialize_align()
159199
{
160200
// Test align

0 commit comments

Comments
 (0)