Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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
raklaptudirm merged 2 commits into TheAlgorithms:master from nibble-4bits:algorithm/bufferToBase64
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
View file Open in desktop
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
View file Open in desktop
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==')
})
})

AltStyle によって変換されたページ (->オリジナル) /