diff --git a/src/message.cpp b/src/message.cpp
index 7eea4c24ff91d97d38c36aae2a1246fb4078eb41..343b09472d5f410489006396172b0c4ddff68137 100644
--- a/src/message.cpp
+++ b/src/message.cpp
@@ -21,7 +21,7 @@ std::size_t varint_length(
     T value
 ) {
     std::size_t result = 1;
-    while (value > 128U) {
+    while (value >= 128U) {
         ++result;
         value >>= 7;
     }
@@ -34,8 +34,9 @@ std::uint8_t * varint_encode(
     std::uint8_t * output,
     T value
 ) {
-    while (value > 128U) {
+    while (value >= 128U) {
         *(output++) = (0x7F & value) | 0x80;
+        value >>= 7;
     }
     (*output++) = value;
     return output;