Browse Source

Start implementation of Base64 decoding

Patrick-Christopher Mattulat 3 years ago
parent
commit
27ac1d5c73

+ 19 - 4
include/ls_std/encoding/base64/Base64.hpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-01-03
- * Changed:         2022-01-16
+ * Changed:         2022-02-06
  *
  * */
 
@@ -13,6 +13,7 @@
 #include <ls_std/encoding/IEncoding.hpp>
 #include <bitset>
 #include <vector>
+#include <unordered_map>
 
 namespace ls_std
 {
@@ -30,7 +31,19 @@ namespace ls_std
 
     private:
 
-      const std::vector<char> table
+      const std::unordered_map<char, uint8_t> decodingTable
+      {
+        {'A', 0}, {'B', 1}, {'C', 2}, {'D', 3}, {'E', 4}, {'F', 5}, {'G', 6}, {'H', 7},
+        {'I', 8}, {'J', 9}, {'K', 10}, {'L', 11}, {'M', 12}, {'N', 13}, {'O', 14}, {'P', 15},
+        {'Q', 16}, {'R', 17}, {'S', 18}, {'T', 19}, {'U', 20}, {'V', 21}, {'W', 22}, {'X', 23},
+        {'Y', 24}, {'Z', 25}, {'a', 26}, {'b', 27}, {'c', 28}, {'d', 29}, {'e', 30}, {'f', 31},
+        {'g', 32}, {'h', 33}, {'i', 34}, {'j', 35}, {'k', 36}, {'l', 37}, {'m', 38}, {'n', 39},
+        {'o', 40}, {'p', 41}, {'q', 42}, {'r', 43}, {'s', 44}, {'t', 45}, {'u', 46}, {'v', 47},
+        {'w', 48}, {'x', 49}, {'y', 50}, {'z', 51}, {'0', 52}, {'1', 53}, {'2', 54}, {'3', 55},
+        {'4', 56}, {'5', 57}, {'6', 58}, {'7', 59}, {'8', 60}, {'9', 61}, {'+', 62}, {'/', 63}
+      };
+
+      const std::vector<char> encodingTable
       {
         'A','B','C','D','E','F','G','H',
         'I','J','K','L','M','N','O','P',
@@ -46,8 +59,10 @@ namespace ls_std
       std::string _getEncodingFromBitSequence(uint32_t bitSequence, size_t characterSequenceSize);
       static uint32_t _getBitSequenceFromCharacterSequence(const std::string &basicString);
       char _getCharacterFromLookUpTable(uint8_t byteBuffer, uint8_t shiftByBits);
-      std::string _getEncodingFromCharacterSequence(const std::string& characterSequence);
-      static std::string _getNextByteTriple(const std::string& _sequence, size_t index);
+      std::string _getEncodingFromByteTriple(const std::string& characterSequence);
+      static std::string _getNextByteTriple(const std::string& _sequence, size_t _index);
+      static std::string _getNextByteQuadruple(const std::string &_sequence, size_t _index);
+      std::string _getDecodingFromByteQuadruple(std::string _byteQuadruple);
   };
 }
 

+ 26 - 19
source/ls_std/encoding/base64/Base64.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-01-03
- * Changed:         2022-01-16
+ * Changed:         2022-02-06
  *
  * */
 
@@ -12,12 +12,12 @@
 
 std::string ls_std::Base64::encode(const std::string &_sequence)
 {
-  std::string encodedString, subSequence{};
+  std::string encodedString, byteTriple{};
 
   for(size_t index = 0 ; index < _sequence.size() ; index += 3)
   {
-    subSequence = ls_std::Base64::_getNextByteTriple(_sequence, index);
-    encodedString += ls_std::Base64::_getEncodingFromCharacterSequence(subSequence);
+    byteTriple = ls_std::Base64::_getNextByteTriple(_sequence, index);
+    encodedString += ls_std::Base64::_getEncodingFromByteTriple(byteTriple);
   }
 
   return encodedString;
@@ -25,7 +25,15 @@ std::string ls_std::Base64::encode(const std::string &_sequence)
 
 std::string ls_std::Base64::decode(const std::string &_sequence)
 {
-  return "";
+  std::string decodedString, byteQuadruple{};
+
+  for(size_t index = 0 ; index < byteQuadruple.size() ; index += 4)
+  {
+    byteQuadruple = ls_std::Base64::_getNextByteQuadruple(_sequence, index);
+    decodedString += ls_std::Base64::_getDecodingFromByteQuadruple(byteQuadruple);
+  }
+
+  return decodedString;
 }
 
 uint8_t ls_std::Base64::_detectInitialShiftNumber(size_t size)
@@ -69,10 +77,10 @@ char ls_std::Base64::_getCharacterFromLookUpTable(uint8_t byteBuffer, uint8_t sh
   bitSequence.set(6, false);
   bitSequence.set(7, false);
 
-  return this->table[bitSequence.to_ulong()];
+  return this->encodingTable[bitSequence.to_ulong()];
 }
 
-std::string ls_std::Base64::_getEncodingFromCharacterSequence(const std::string& characterSequence)
+std::string ls_std::Base64::_getEncodingFromByteTriple(const std::string& characterSequence)
 {
   uint32_t bitSequence = ls_std::Base64::_getBitSequenceFromCharacterSequence(characterSequence);
   std::string encodingString = this->_getEncodingFromBitSequence(bitSequence, characterSequence.size());
@@ -80,20 +88,19 @@ std::string ls_std::Base64::_getEncodingFromCharacterSequence(const std::string&
   return encodingString;
 }
 
-std::string ls_std::Base64::_getNextByteTriple(const std::string &_sequence, size_t index)
+std::string ls_std::Base64::_getNextByteTriple(const std::string &_sequence, size_t _index)
 {
-  std::string subSequence{_sequence[index]};
-  size_t size = _sequence.size();
+  return _sequence.substr(_index, 3);
+}
 
-  if((index + 1) < size)
-  {
-    subSequence += (_sequence[index+1]);
-  }
+std::string ls_std::Base64::_getNextByteQuadruple(const std::string &_sequence, size_t _index)
+{
+  return _sequence.substr(_index, 4);
+}
+
+std::string ls_std::Base64::_getDecodingFromByteQuadruple(std::string _byteQuadruple)
+{
 
-  if((index + 2) < size)
-  {
-    subSequence += (_sequence[index+2]);
-  }
 
-  return subSequence;
+  return std::string();
 }

+ 9 - 1
test/cases/encoding/base64/Base64Test.cpp

@@ -3,7 +3,7 @@
  * Company:         Lynar Studios
  * E-Mail:          webmaster@lynarstudios.com
  * Created:         2022-01-08
- * Changed:         2022-01-08
+ * Changed:         2022-02-06
  *
  * */
 
@@ -36,4 +36,12 @@ namespace
 
     ASSERT_STREQ("YWJj", base64.encode(sequence).c_str());
   }
+
+  TEST_F(Base64Test, decode)
+  {
+    ls_std::Base64 base64{};
+    std::string base64Sequence = "YWJjZA==";
+
+    ASSERT_STREQ("abcd", base64.decode(base64Sequence).c_str());
+  }
 }