Pure Programmer
Blue Matrix


Cluster Map

Project: Base64 Encoding

[[Base64]] is a binary-to-text encoding scheme used in the early days of computing when SMTP (email) and other network protocols only supported 7-bit bytes. It is still used today for attachments to email files. The idea is to convert a file that uses 8-bit bytes into a stream of 7-bit ASCII characters. By using a radix of 64 we can represent 6-bit values with one of the characters A-Z, a-z, 0-9, +, /. So the idea is to break three octets up into four sextets, then convert the sextet to one of our 64 7-bit safe ASCII characters. Depending on the length of the data one or two equal signs '=' will need to be output at the end to pad the output to an even multiple of four. Also to make things easier to read, a newline is output after every 76 output characters.

Write a program that accepts a filename on the command line, converts the file to Base64 and outputs it to the console.

See Base64Decoding

Output
$ g++ -std=c++17 Base64Encoding.cpp -o Base64Encoding -lfmt $ ./Base64Encoding ../../data/text/GettysburgAddress.txt TGluY29sbidzIEdldHR5c2J1cmcgQWRkcmVzcywgZ2l2ZW4gTm92ZW1iZXIgMTksIDE4NjMKb24g dGhlIGJhdHRsZWZpZWxkIG5lYXIgR2V0dHlzYnVyZywgUGVubnN5bHZhbmlhLCBVU0EKCkZvdXIg c2NvcmUgYW5kIHNldmVuIHllYXJzIGFnbyBvdXIgZmF0aGVycyBicm91Z2h0IGZvcnRoIG9uIHRo aXMgY29udGluZW50LCBhIG5ldyBuYXRpb24sIGNvbmNlaXZlZCBpbiBMaWJlcnR5LCBhbmQgZGVk aWNhdGVkIHRvIHRoZSBwcm9wb3NpdGlvbiB0aGF0IGFsbCBtZW4gYXJlIGNyZWF0ZWQgZXF1YWwu CgpOb3cgd2UgYXJlIGVuZ2FnZWQgaW4gYSBncmVhdCBjaXZpbCB3YXIsIHRlc3Rpbmcgd2hldGhl ciB0aGF0IG5hdGlvbiwgb3IgYW55IG5hdGlvbiBzbyBjb25jZWl2ZWQgYW5kIHNvIGRlZGljYXRl ZCwgY2FuIGxvbmcgZW5kdXJlLiBXZSBhcmUgbWV0IG9uIGEgZ3JlYXQgYmF0dGxlLWZpZWxkIG9m IHRoYXQgd2FyLiBXZSBoYXZlIGNvbWUgdG8gZGVkaWNhdGUgYSBwb3J0aW9uIG9mIHRoYXQgZmll bGQsIGFzIGEgZmluYWwgcmVzdGluZyBwbGFjZSBmb3IgdGhvc2Ugd2hvIGhlcmUgZ2F2ZSB0aGVp ... YmUgZGVkaWNhdGVkIGhlcmUgdG8gdGhlIHVuZmluaXNoZWQgd29yayB3aGljaCB0aGV5IHdobyBm b3VnaHQgaGVyZSBoYXZlIHRodXMgZmFyIHNvIG5vYmx5IGFkdmFuY2VkLiBJdCBpcyByYXRoZXIg Zm9yIHVzIHRvIGJlIGhlcmUgZGVkaWNhdGVkIHRvIHRoZSBncmVhdCB0YXNrIHJlbWFpbmluZyBi ZWZvcmUgdXMtdGhhdCBmcm9tIHRoZXNlIGhvbm9yZWQgZGVhZCB3ZSB0YWtlIGluY3JlYXNlZCBk ZXZvdGlvbiB0byB0aGF0IGNhdXNlIGZvciB3aGljaCB0aGV5IGdhdmUgdGhlIGxhc3QgZnVsbCBt ZWFzdXJlIG9mIGRldm90aW9uLXRoYXQgd2UgaGVyZSBoaWdobHkgcmVzb2x2ZSB0aGF0IHRoZXNl IGRlYWQgc2hhbGwgbm90IGhhdmUgZGllZCBpbiB2YWluLXRoYXQgdGhpcyBuYXRpb24sIHVuZGVy IEdvZCwgc2hhbGwgaGF2ZSBhIG5ldyBiaXJ0aCBvZiBmcmVlZG9tLWFuZCB0aGF0IGdvdmVybm1l bnQgb2YgdGhlIHBlb3BsZSwgYnkgdGhlIHBlb3BsZSwgZm9yIHRoZSBwZW9wbGUsIHNoYWxsIG5v dCBwZXJpc2ggZnJvbSB0aGUgZWFydGguCg== $ g++ -std=c++17 Base64Encoding.cpp -o Base64Encoding -lfmt $ ./Base64Encoding ../../data/text/UnicodeTest.utf8 Rm91ciBzY29yZSBhbmQgc2V2ZW4geWVhcnMgYWdvIG91ciBmYXRoZXJzIGJyb3VnaHQgZm9ydGgg b24gdGhpcyBjb250aW5lbnQsIGEgbmV3IG5hdGlvbiwgY29uY2VpdmVkIGluIExpYmVydHksIGFu ZCBkZWRpY2F0ZWQgdG8gdGhlIHByb3Bvc2l0aW9uIHRoYXQgYWxsIG1lbiBhcmUgY3JlYXRlZCBl cXVhbC4KClZvciB2aWVyIFB1bmt0ZW4gdW5kIHNpZWJlbiBKYWhyZW4gaGFiZW4gdW5zZXJlIFbD pHRlciBhdWYgZGllc2VtIEtvbnRpbmVudCBlaW5lIG5ldWUgTmF0aW9uIGhlcnZvcmdlYnJhY2h0 LCBkaWUgaW4gRnJlaWhlaXQgZW1wZmFuZ2VuIHd1cmRlIHVuZCBzaWNoIGRlbSBWb3JzY2hsYWcg dmVyc2NocmllYmVuIGhhdCwgZGFzcyBhbGxlIE1lbnNjaGVuIGdsZWljaCBnZXNjaGFmZmVuIHNp bmQuCgrOpM6tz4PPg861z4HOsSDPg866zr/PgSDOus6xzrkgz4DPgc65zr0gzrHPgM+MIM61z4DP hM6sIM+Hz4HPjM69zrnOsSDOv865IM+AzrHPhM6tz4HOtc+CIM68zrHPgiDOrc+GzrXPgc6xzr0g z4POtSDOsc+Fz4TOriDPhM63zr0gzq7PgM61zrnPgc6/LCDOrc69zrEgzr3Orc6/IM6tzrjOvc6/ ... aQrwn6SjIFJvbGxpbmcgb24gdGhlIEZsb29yIExhdWdoaW5nCvCfpKIgTmF1c2VhdGVkIEZhY2UK 8J+koSBDbG93biBGYWNlCvCfpoogRm94CvCfpoggU2hhcmsKClVuaWNvZGUgOCBFbW9qaQrwn6SR IE1vbmV5LU1vdXRoIEZhY2UK8J+kkyBOZXJkIEZhY2UK8J+mgSBMaW9uCvCfpoQgVW5pY29ybgrw n6aAIENyYWIKClVuaWNvZGUgNyBFbW9qaQrwn5aWIFZ1bGNhbiBTYWx1dGUK8J+QvyBDaGlwbXVu awrwn5W3IFNwaWRlcgrwn4y2IEhvdCBQZXBwZXIK8J+MqiBUb3JuYWRvCgpQcmVjb21wb3NlZCB2 cy4gRGVjb21wb3NlZArDhSA9IEHMigrDoCA9IGHMgArDqSA9IGXMgQrDriA9IGnMggrDsSA9IG7M gwrDvCA9IHXMiArtlZwgPSDhhJLhhaHhhqsKCkdyYXBoZW1lcyB0aGF0IHRha2UgdHdvIGNvZGVw b2ludHMKQ2FuYWRhIPCfh6jwn4emCkNoaW5hIPCfh6jwn4ezCkZyYW5jZSDwn4er8J+HtwpHcmVl Y2Ug8J+HrPCfh7cKSXNyYWVsIPCfh67wn4exCkphcGFuIPCfh6/wn4e1Ck1leGljbyDwn4ey8J+H vQpVSyDwn4es8J+HpwpVUyDwn4e68J+HuCAK $ g++ -std=c++17 Base64Encoding.cpp -o Base64Encoding -lfmt $ ./Base64Encoding ../../data/images/GlowingCat.jpg /9j/4AAQSkZJRgABAQEAeAB4AAD/4QBaRXhpZgAATU0AKgAAAAgABQMBAAUAAAABAAAASgMDAAEA AAABAAAAAFEQAAEAAAABAQAAAFERAAQAAAABAAACJlESAAQAAAABAAACJgAAAAAAAYagAACxj//b AEMAAgEBAgEBAgICAgICAgIDBQMDAwMDBgQEAwUHBgcHBwYHBwgJCwkICAoIBwcKDQoKCwwMDAwH CQ4PDQwOCwwMDP/bAEMBAgICAwMDBgMDBgwIBwgMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDP/AABEIAZoBmgMBIgACEQEDEQH/xAAfAAABBQEBAQEBAQAA AAAAAAAAAQIDBAUGBwgJCgv/xAC1EAACAQMDAgQDBQUEBAAAAX0BAgMABBEFEiExQQYTUWEHInEU MoGRoQgjQrHBFVLR8CQzYnKCCQoWFxgZGiUmJygpKjQ1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2Rl ZmdoaWpzdHV2d3h5eoOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK 0tPU1dbX2Nna4eLj5OXm5+jp6vHy8/T19vf4+fr/xAAfAQADAQEBAQEBAQEBAAAAAAAAAQIDBAUG BwgJCgv/xAC1EQACAQIEBAMEBwUEBAABAncAAQIDEQQFITEGEkFRB2FxEyIygQgUQpGhscEJIzNS ... KiNRx2Im7WKUuhf2bbhh8xcZx6VY0e9eOPa28AcY9Kt6qB5Z/wB2mWCgaGxAANOcuaCbG3dC/wBq F5MBztHBqvqGooXKnoRTF5s2zWVqB+ZfpRTgr3ERXtw0Uo2Jx2pftDzWx3vsOeF9ai1MAWKkcEii z/49/wDgIrvcbRKhuTwWP2pCG2Bl+YCqmo2eHA43tzU1nxIafcMftK8nrThuXP4ilZQSpcME37gM H61b0XT7ifXYlkTKs3PvXReF1BvuQK6i3toxdxkRoDu67RXLicW4J2QjZ0DQIdPtd6jkjNM1TVfI UgduK1oOLJscVx/jF2wvJ6+tfK0f31a8wMvX9Y+2TFX7HiqF7YMbLfG2xsZJpGAaVsjPJp93xpzj sFr6KnBR0Qyjp980VheI7eYTEc/nXN6pdSRzOQHC5JH0rSsOLO4x71zt/KwUfM3516lGmrmaZr+H vFM1oyMjOJ7c5X/aU9RWf46tUm1P7dbqRDfZkVP7rHkj86q6Wf8AiZIe+w1o3oz4IQnkrO2Pbmu+ EUndHPKNmcznPtRTD/rD9afXShDX6U2pKKYEdFDdTRQAU5DzTaVOtAF7SNWk0a+SeJ9rpyG/pW9q UcXjK0e/iCRXqL/pNv2f/bT/AGj1PvXLVb0Niuopgkc1MgK0ylHAPUcGm1c1w/8AEzm93P8AOqY6 CmgP/9k=

Solution