diff --git a/src/logger.c b/src/logger.c
index 9245a31b8e2db15b500717c5449ca250306d6caf..6fc2f787e7b1172d735683fe94fa99d85b5c4219 100644
--- a/src/logger.c
+++ b/src/logger.c
@@ -537,6 +537,28 @@ void logger_const_free(struct logger_const* log_const) {
   free(log_const->masks_size);
 }
 
+
+/**
+ * @brief read chunk header
+ *
+ * @param buff The reading buffer
+ * @param mask The mask to read
+ * @param offset Out: the offset pointed by this chunk (absolute)
+ * @param offset_cur The current chunk offset
+ *
+ * @return Number of bytes read
+ */
+__attribute__((always_inline)) INLINE static int logger_read_chunk_header(const char *buff, unsigned int *mask, size_t *offset, size_t cur_offset) {
+  memcpy(mask, buff, logger_size_mask);
+  buff += logger_size_mask;
+
+  *offset = 0;
+  memcpy(offset, buff, logger_size_offset);
+  *offset = cur_offset - *offset;
+  
+  return logger_size_mask + logger_size_offset;
+}
+
 /**
  * @brief Read a logger message and store the data in a #part.
  *
@@ -553,11 +575,9 @@ int logger_read_part(struct part *p, size_t *offset, const char *buff) {
   buff = &buff[*offset];
 
   /* Start by reading the logger mask for this entry. */
-  uint64_t temp;
-  memcpy(&temp, buff, 8);
-  const int mask = temp >> 56;
-  *offset -= temp & 0xffffffffffffffULL;
-  buff += 8;
+  const size_t cur_offset = *offset;
+  unsigned int mask = 0;
+  buff += logger_read_chunk_header(buff, &mask, offset, cur_offset);
 
   /* We are only interested in particle data. */
   if (mask & logger_mask_timestamp)
@@ -631,11 +651,9 @@ int logger_read_gpart(struct gpart *p, size_t *offset, const char *buff) {
   buff = &buff[*offset];
 
   /* Start by reading the logger mask for this entry. */
-  uint64_t temp;
-  memcpy(&temp, buff, 8);
-  const int mask = temp >> 56;
-  *offset -= temp & 0xffffffffffffffULL;
-  buff += 8;
+  const size_t cur_offset = *offset;
+  unsigned int mask = 0;
+  buff += logger_read_chunk_header(buff, &mask, offset, cur_offset);
 
   /* We are only interested in particle data. */
   if (mask & logger_mask_timestamp)
@@ -692,11 +710,9 @@ int logger_read_timestamp(unsigned long long int *t, size_t *offset,
   buff = &buff[*offset];
 
   /* Start by reading the logger mask for this entry. */
-  uint64_t temp;
-  memcpy(&temp, buff, 8);
-  const int mask = temp >> 56;
-  *offset -= temp & 0xffffffffffffffULL;
-  buff += 8;
+  const size_t cur_offset = *offset;
+  unsigned int mask = 0;
+  buff += logger_read_chunk_header(buff, &mask, offset, cur_offset);
 
   /* We are only interested in timestamps. */
   if (!(mask & logger_mask_timestamp))