From 8e1bdfdca2ad2157fd74cedc1a6768a1b1c0849d Mon Sep 17 00:00:00 2001
From: gcontini <1121667+gcontini@users.noreply.github.com>
Date: 周日, 09 2月 2020 04:48:55 +0800
Subject: [PATCH] identifiers next work

---
 src/library/base/base64.cpp |   35 ++++++++++++++++-------------------
 1 files changed, 16 insertions(+), 19 deletions(-)

diff --git a/src/library/base/base64.cpp b/src/library/base/base64.cpp
index af66658..a8f1c4c 100644
--- a/src/library/base/base64.cpp
+++ b/src/library/base/base64.cpp
@@ -1,5 +1,6 @@
 #include <stdio.h>
 #include <stdlib.h>
+#include <algorithm>
 
 #include "base64.h"
 namespace license {
@@ -102,28 +103,26 @@
 	return encodeBuffer;
 }
 
-unsigned char* unbase64(const char* ascii, int len, int* flen) {
-	const unsigned char* safeAsciiPtr = (const unsigned char*)ascii;
-	unsigned char* bin;
+std::vector<uint8_t> unbase64(const std::string& base64_data) {
+	string tmp_str(base64_data);
+	tmp_str.erase(std::remove(tmp_str.begin(), tmp_str.end(), '\n'), tmp_str.end());
+	const unsigned char* safeAsciiPtr = (const unsigned char*)tmp_str.c_str();
+	std::vector<uint8_t> bin;
 	int cb = 0;
 	int charNo;
 	int pad = 0;
+	int len = tmp_str.size();
 
 	if (len < 2) {  // 2 accesses below would be OOB.
 		// catch empty string, return NULL as result.
 		puts("ERROR: You passed an invalid base64 string (too short). You get NULL back.");
-		*flen = 0;
-		return 0;
+		return bin;
 	}
 	if (safeAsciiPtr[len - 1] == '=') ++pad;
 	if (safeAsciiPtr[len - 2] == '=') ++pad;
 
-	*flen = 3 * len / 4 - pad;
-	bin = (unsigned char*)malloc(*flen);
-	if (!bin) {
-		puts("ERROR: unbase64 could not allocate enough memory.");
-		return 0;
-	}
+	unsigned int flen = 3 * len / 4 - pad;
+	bin.reserve(flen);
 
 	for (charNo = 0; charNo <= len - 4 - pad; charNo += 4) {
 		int A = unb64[safeAsciiPtr[charNo]];
@@ -131,23 +130,21 @@
 		int C = unb64[safeAsciiPtr[charNo + 2]];
 		int D = unb64[safeAsciiPtr[charNo + 3]];
 
-		bin[cb++] = (A << 2) | (B >> 4);
-		bin[cb++] = (B << 4) | (C >> 2);
-		bin[cb++] = (C << 6) | (D);
+		bin.push_back((A << 2) | (B >> 4));
+		bin.push_back((B << 4) | (C >> 2));
+		bin.push_back((C << 6) | (D));
 	}
 
 	if (pad == 1) {
 		int A = unb64[safeAsciiPtr[charNo]];
 		int B = unb64[safeAsciiPtr[charNo + 1]];
 		int C = unb64[safeAsciiPtr[charNo + 2]];
-
-		bin[cb++] = (A << 2) | (B >> 4);
-		bin[cb++] = (B << 4) | (C >> 2);
+		bin.push_back((A << 2) | (B >> 4));
+		bin.push_back((B << 4) | (C >> 2));
 	} else if (pad == 2) {
 		int A = unb64[safeAsciiPtr[charNo]];
 		int B = unb64[safeAsciiPtr[charNo + 1]];
-
-		bin[cb++] = (A << 2) | (B >> 4);
+		bin.push_back((A << 2) | (B >> 4));
 	}
 
 	return bin;

--
Gitblit v1.9.1