-
-
Notifications
You must be signed in to change notification settings - Fork 5.8k
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
Changes from all commits
Commits
Show all changes
2 commits
Select commit
Hold shift + click to select a range
File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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==') | ||
}) | ||
}) |
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.