Skip to content

Create algorithm for converting binary data to base64 #756

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Oct 8, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 41 additions & 0 deletions Conversions/ArrayBufferToBase64.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
// About base64: https://en.wikipedia.org/wiki/Base64

/**
* Converts an array of bytes to base64 encoding
* @param {ArrayBuffer} binaryData An ArrayBuffer which represents an array of bytes
* @returns {string} A string containing the base64 encoding of `binaryData`
*/
function bufferToBase64 (binaryData) {
// The base64 encoding uses the following set of characters to encode any binary data as text
const base64Table = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
// Every 3 bytes translates to 4 base64 characters, if we have less than 3 bytes we must append '=' chars as padding
const padding = 3 - (binaryData.byteLength % 3)
// Create an instance of Uint8Array, to read from the binaryData array buffer
const byteView = new Uint8Array(binaryData)
let result = ''

// Loop through all bytes in the buffer, in increments of 3 bytes
for (let i = 0; i < byteView.byteLength; i += 3) {
// Get the index for the next 4 base64 chars
const char1 = (byteView[i] & 252) >> 2
const char2 = ((byteView[i] & 3) << 4) + ((byteView[i + 1] & 240) >> 4)
const char3 = ((byteView[i + 1] & 15) << 2) + ((byteView[i + 2] & 192) >> 6)
const char4 = byteView[i + 2] & 63

result +=
base64Table[char1] +
base64Table[char2] +
base64Table[char3] +
base64Table[char4]
}

// Add padding '=' chars if needed
if (padding !== 3) {
const paddedResult = result.slice(0, result.length - padding) + '='.repeat(padding)
return paddedResult
}

return result
}

export { bufferToBase64 }
24 changes: 24 additions & 0 deletions Conversions/test/ArrayBufferToBase64.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { bufferToBase64 } from '../ArrayBufferToBase64'
import { TextEncoder } from 'util'

describe('ArrayBufferToBase64', () => {
it('should encode "Hello, world!" as "SGVsbG8sIHdvcmxkIQ=="', () => {
const testString = 'Hello, world!'
const encoder = new TextEncoder()
const helloWorldBuffer = encoder.encode(testString)
const result = bufferToBase64(helloWorldBuffer)
expect(result).toBe('SGVsbG8sIHdvcmxkIQ==')
})

it('should encode binary buffer [55,23,177,234,68,26,90] as "Nxex6kQaWg=="', () => {
const testBuffer = new Uint8Array([55, 23, 177, 234, 68, 26, 90])
const result = bufferToBase64(testBuffer)
expect(result).toBe('Nxex6kQaWg==')
})

it('should encode binary buffer [0,1,2,3,4,5,6,7,8,9] as "AAECAwQFBgcICQ=="', () => {
const testBuffer = new Uint8Array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
const result = bufferToBase64(testBuffer)
expect(result).toBe('AAECAwQFBgcICQ==')
})
})