| /* | |
| * Copyright 2023 Google LLC | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| #ifndef SW_DEVICE_LIB_TESTING_TEST_ROM_PUPPETEER_UTILS_BASE64_H_ | |
| #define SW_DEVICE_LIB_TESTING_TEST_ROM_PUPPETEER_UTILS_BASE64_H_ | |
| #include <stdint.h> | |
| // Simple base64-to-byte converter. | |
| // Usage: | |
| // | |
| // Base64 b; | |
| // b.put_b64('R'); | |
| // b.put_b64('m'); | |
| // b.put_b64('9'); | |
| // b.put_b64('v'); | |
| // | |
| // printf("This should say 'Foo': %c%c%c\n", | |
| // b.get_byte(), b.get_byte(), b.get_byte()); | |
| // | |
| struct Base64 { | |
| uint32_t accum = 0; | |
| int count = 0; | |
| void put_b64(uint8_t b) { | |
| if (b == '=') return; | |
| accum <<= 6; | |
| if (b >= 'A' && b <= 'Z') accum |= b - 'A'; | |
| if (b >= 'a' && b <= 'z') accum |= b - 'a' + 26; | |
| if (b >= '0' && b <= '9') accum |= b - '0' + 52; | |
| if (b == '+') accum |= 62; | |
| if (b == '/') accum |= 63; | |
| count += 6; | |
| } | |
| void put_byte(uint8_t c) { | |
| accum <<= 8; | |
| accum |= c; | |
| count += 8; | |
| } | |
| uint8_t get_b64() { | |
| uint8_t b = (accum >> (count - 6)) & 0x3F; | |
| count -= 6; | |
| if (b <= 25) return 'A' + b; | |
| if (b <= 51) return 'a' + b - 26; | |
| if (b <= 61) return '0' + b - 52; | |
| if (b == 62) return '+'; | |
| if (b == 63) return '/'; | |
| return -1; | |
| } | |
| uint8_t get_byte() { | |
| uint8_t result = (accum >> (count - 8)) & 0xFF; | |
| count -= 8; | |
| return result; | |
| } | |
| }; | |
| #endif // SW_DEVICE_LIB_TESTING_TEST_ROM_PUPPETEER_UTILS_BASE64_H_ |