Fix a bug in the Base32 encoder that can cause improper encoding of the first byte (#28328)

diff --git a/fml/base32.cc b/fml/base32.cc
index 1cd2992..6138f0f 100644
--- a/fml/base32.cc
+++ b/fml/base32.cc
@@ -25,7 +25,7 @@
   output.reserve(encoded_length);
 
   Base32EncodeConverter converter;
-  converter.Append(input[0]);
+  converter.Append(static_cast<uint8_t>(input[0]));
   size_t next_byte_index = 1;
 
   while (converter.CanExtract()) {
diff --git a/fml/base32.h b/fml/base32.h
index bd8199b..aacbdc6 100644
--- a/fml/base32.h
+++ b/fml/base32.h
@@ -16,7 +16,7 @@
 class BitConverter {
  public:
   void Append(int bits) {
-    FML_DCHECK(bits < (1 << from_length));
+    FML_DCHECK(bits >= 0 && bits < (1 << from_length));
     FML_DCHECK(CanAppend());
     lower_free_bits_ -= from_length;
     buffer_ |= (bits << lower_free_bits_);
diff --git a/fml/base32_unittest.cc b/fml/base32_unittest.cc
index c8e57f4..b3d7c1f 100644
--- a/fml/base32_unittest.cc
+++ b/fml/base32_unittest.cc
@@ -38,6 +38,12 @@
     ASSERT_TRUE(result.first);
     ASSERT_EQ(result.second, "NBSWYTDP");
   }
+
+  {
+    auto result = fml::Base32Encode("\xff\xfe\x7f\x80\x81");
+    ASSERT_TRUE(result.first);
+    ASSERT_EQ(result.second, "777H7AEB");
+  }
 }
 
 TEST(Base32Test, CanEncodeDecodeStrings) {