diff options
Diffstat (limited to 'gr-digital/lib/crc32_bb_impl.cc')
-rw-r--r-- | gr-digital/lib/crc32_bb_impl.cc | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/gr-digital/lib/crc32_bb_impl.cc b/gr-digital/lib/crc32_bb_impl.cc index afb5e32716..fc88e7f215 100644 --- a/gr-digital/lib/crc32_bb_impl.cc +++ b/gr-digital/lib/crc32_bb_impl.cc @@ -65,6 +65,26 @@ namespace gr { } } + unsigned int + crc32_bb_impl::calculate_crc32(const unsigned char* in, size_t packet_length){ + unsigned int crc = 0; + d_crc_impl.reset(); + if (!d_packed){ + const size_t n_packed_length = 1 + ((packet_length - 1) / 8); + unsigned char packed_buffer[n_packed_length]; + memset(packed_buffer, 0, n_packed_length); + for (size_t bit = 0; bit < packet_length; bit++){ + packed_buffer[bit/8] |= (in[bit] << (bit % 8)); + } + d_crc_impl.process_bytes(packed_buffer, n_packed_length); + crc = d_crc_impl(); + } else{ + d_crc_impl.process_bytes(in, packet_length); + crc = d_crc_impl(); + } + return crc; + } + int crc32_bb_impl::work(int noutput_items, gr_vector_int &ninput_items, @@ -72,14 +92,13 @@ namespace gr { gr_vector_void_star &output_items) { const unsigned char *in = (const unsigned char *) input_items[0]; unsigned char *out = (unsigned char *) output_items[0]; - long packet_length = ninput_items[0]; + size_t packet_length = ninput_items[0]; int packet_size_diff = d_check ? -d_crc_length : d_crc_length; unsigned int crc; if (d_check) { - d_crc_impl.reset(); d_crc_impl.process_bytes(in, packet_length - d_crc_length); - crc = d_crc_impl(); + crc = calculate_crc32(in, packet_length - d_crc_length); if (d_packed) { if (crc != *(unsigned int *) (in + packet_length - d_crc_length)) { // Drop package d_nfail++; @@ -97,9 +116,7 @@ namespace gr { d_npass++; memcpy((void *) out, (const void *) in, packet_length - d_crc_length); } else { - d_crc_impl.reset(); - d_crc_impl.process_bytes(in, packet_length); - crc = d_crc_impl(); + crc = calculate_crc32(in, packet_length); memcpy((void *) out, (const void *) in, packet_length); if (d_packed) { memcpy((void *) (out + packet_length), &crc, d_crc_length); // FIXME big-endian/little-endian, this might be wrong |