Browse Source

fix base64 decoding

Kolja Strohm 1 year ago
parent
commit
e50fc87bc1
3 changed files with 14 additions and 4 deletions
  1. 3 4
      Base64.cpp
  2. 11 0
      Framework Tests/Base64.cpp
  3. BIN
      Framework Tests/Framwork.dll

+ 3 - 4
Base64.cpp

@@ -1,5 +1,4 @@
 #include "Base64.h"
-#include <math.h>
 
 using namespace Framework;
 
@@ -63,7 +62,7 @@ bool Framework::base64Decode(Text base64, char** data, int* length)
 			return false;
 		l++;
 	}
-	*length = (int)ceil(l / 4.f) * 3;
+	*length = (l * 3) / 4;
 	*data = new char[*length + 1];
 	while (base64[k])
 	{
@@ -75,7 +74,7 @@ bool Framework::base64Decode(Text base64, char** data, int* length)
 			char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
 			char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
 			char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
-			for (i = 0; (i < 3); i++)
+			for (i = 0; (i < 3) && n < *length; i++)
 				(*data)[n++] = char_array_3[i];
 			i = 0;
 		}
@@ -90,7 +89,7 @@ bool Framework::base64Decode(Text base64, char** data, int* length)
 		char_array_3[0] = (unsigned char)((char_array_4[0] << 2) + ((char_array_4[1] & 0x30) >> 4));
 		char_array_3[1] = (unsigned char)(((char_array_4[1] & 0xf) << 4) + ((char_array_4[2] & 0x3c) >> 2));
 		char_array_3[2] = (unsigned char)(((char_array_4[2] & 0x3) << 6) + char_array_4[3]);
-		for (j = 0; (j < i - 1); j++)
+		for (j = 0; (j < i - 1) && n < *length; j++)
 			(*data)[n++] = char_array_3[j];
 	}
 	(*data)[*length] = '\0';

+ 11 - 0
Framework Tests/Base64.cpp

@@ -40,5 +40,16 @@ namespace FrameworkTests
 			Assert::AreEqual(0, decodecLength);
 			delete[] decodedData;
 		}
+
+		TEST_METHOD(TestDecodeAndEncode)
+		{
+			const char* data = "g0OLN0EJepEiT8eiNdvb9PfJkIqSpiLqb3uvRwyg2Y7iZsQkbkC1kI99M8NaELhT2Erca/D+VmB6B6aFpoAViuXZrlQaZeSo4RhtPScmjwFwbGtha8DA5Mdna2/ngPjOWqgkdA4JHe8hiS1Ir7tIICmygZR0Qnk8qeSrkWWlYL5OhDRcjFBMrNl584o1Pape7izxZG1soBdRTKi28Ap2QI2pmxr55sbTYbtelfcK8+c15UyiUuy4ozliWitr0Gr3egYAE3Ts2UlOlafjjbDXdeS+wYcRrkGz56IPEw/efQgAAAAAWYMbzXDzF76JvaIYb3uNVDpQ20v9Hf3mvw75zet31Ub57xRr4ysqbujMhVhIFKuCY4jMYqTLSWXYRDTFuwoMtfggIt1KS0w0GdGLYOQ44ki/r6lle/LJVDf9GvEIAAAAACaoAgBFyt6PFyzCL/xPj+GGcipGItOqncd18f1zDfB7Mpp9d2VcCAAAAAB7h8qphRo5Z5+rkeXNZZFrLQdeLHpqHvWct3MUHc8cmFjlQ9z+fESeKNSF9TsXYWgev5OYKrCOxmgDAAAAANmF0fUfK9thCADVAQDa3Ex6BgAi/vpcF13DNB1Yy0cJWw5xXef2MN0XWrl3YpVVrRFbzhFWLCez71rQSCcZUYImwd4PuRDrz2mmSMo8nHlM90lcT3SDAwAAADG1AWXd06wFAAAAAOv8hxK/ZiB6dg1K3rKSqu4wJTwobZh24Rx5R/hN8v058IVLsetqLGJ3dkIqCuwaORJVYH7s1WAJT6cDAAAAAJuaAdSMhiA/c4pq1QIA4Bgs6gYARSQXmYOVhlr1j6mdkkU5kxvEGjoEAAAAAI3DbmPEUHvvO4A1XpbO4S1WPCPk5MB3K/gMRb4lf8KxQzEWCAAAAADFAgCBkPe8ES4cp/v81FI69jgguK9LsbqPcN8PM5JSZKda5TlSokl/vvB8u8XO9b0IAAAAABd2t2Eoc/CYVAHL5VIxjqsXxv25EX54AgD6NcfJLIXRQvuJoiT7k7xQlIg35bnEktCMkIqdDwQAAAAANQMAnwAACjln02TspaXoMEkOLdzJfHFTs1cNeencBgBVAwB6AABoo4lsQ5OkqWgKlg6vfz73jGrVV+ZHqZqethSIlBoEAAAAAPy8jWn+IQ6piBdBlsW/075NP5SkJtpOv3oGANMEAAAAAJntB5erkwGrtA5VPiWV0+pWqKmj5j5IDRqWzJScoZc3kJ3NPDLN5uXbPSQB0vfrKqCVzYjTF5XtrWOCSgUAAAAAGoGUt0/Q6B64z/j18vnI6uXyjHzAFVHXqj+FDsHPEttRppOgeH29MU23J0Gy7yyZ47gWpc1mfXilAwAAAACFZ9KXQyQ/1sO2VYLnojoQ4uv+EIXjx5uJlQMAAAAAMAQAAAAABw+oCpMR2yxU/morwyKARgojgBkGAGwZFvH73Y6FdJGMgjqVF0pyQp1yrMg2zUp812z78HJpC4dcB2bpjNl8Gly1r3IBIrSek2FnyDCwRgkeQviPqwQAAAAAkAQAAAAAGAgAAAAAC33xl1dusLMkYA==";
+			char* decodedData = 0;
+			int decodecLength;
+			Framework::base64Decode(data, &decodedData, &decodecLength);
+			Framework::Text encoded = Framework::base64Encode(decodedData, decodecLength);
+			Assert::IsTrue(encoded.istGleich(data));
+			delete[] decodedData;
+		}
 	};
 }

BIN
Framework Tests/Framwork.dll