mirror of
https://github.com/qntm/base65536
synced 2026-03-29 19:44:45 +02:00
Compare commits
2 Commits
4add117c13
...
9cfc7812d5
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9cfc7812d5 | ||
|
|
97beffcf49 |
10
package-lock.json
generated
10
package-lock.json
generated
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base65536",
|
"name": "base65536",
|
||||||
"version": "4.0.1",
|
"version": "4.0.2",
|
||||||
"lockfileVersion": 1,
|
"lockfileVersion": 1,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@ -2197,12 +2197,12 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"axios": {
|
"axios": {
|
||||||
"version": "0.21.1",
|
"version": "0.21.4",
|
||||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.1.tgz",
|
"resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz",
|
||||||
"integrity": "sha512-dKQiRHxGD9PPRIUNIWvZhPTPpl1rf/OxTYKsqKUDjBwYylTvV7SjSHJb9ratfyzM6wCdLCOYLzs73qpg5c4iGA==",
|
"integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"follow-redirects": "^1.10.0"
|
"follow-redirects": "^1.14.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"babel-jest": {
|
"babel-jest": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "base65536",
|
"name": "base65536",
|
||||||
"version": "4.0.1",
|
"version": "4.0.2",
|
||||||
"description": "Unicode's answer to Base64",
|
"description": "Unicode's answer to Base64",
|
||||||
"homepage": "https://github.com/qntm/base65536",
|
"homepage": "https://github.com/qntm/base65536",
|
||||||
"repository": {
|
"repository": {
|
||||||
|
|||||||
@ -50,11 +50,27 @@ const getAllSafeRanges = rangeSize => {
|
|||||||
|
|
||||||
const allSafeRanges = getAllSafeRanges(1 << 8)
|
const allSafeRanges = getAllSafeRanges(1 << 8)
|
||||||
|
|
||||||
const paddingBlockStart = String.fromCodePoint(allSafeRanges.shift())
|
const paddingRange = allSafeRanges.shift()
|
||||||
|
const paddingBlockStart = String.fromCodePoint(paddingRange)
|
||||||
|
|
||||||
const blockStarts = allSafeRanges.slice(0, 1 << 8).map(x => String.fromCodePoint(x)).join('')
|
const blockStarts = allSafeRanges.slice(0, 1 << 8).map(x => String.fromCodePoint(x)).join('')
|
||||||
|
|
||||||
export { safeCodePoint, paddingBlockStart, blockStarts }
|
const combinedRanges = allSafeRanges.slice(0, 1 << 8).map(start => [start, start + (1 << 8) - 1])
|
||||||
|
let i = 0
|
||||||
|
while (i in combinedRanges) {
|
||||||
|
if (i + 1 in combinedRanges && combinedRanges[i][1] + 1 === combinedRanges[i + 1][0]) {
|
||||||
|
combinedRanges.splice(i, 2, [combinedRanges[i][0], combinedRanges[i + 1][1]])
|
||||||
|
} else {
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const pairStrings = [
|
||||||
|
combinedRanges.map(([start, end]) => String.fromCodePoint(start) + String.fromCodePoint(end)).join(''),
|
||||||
|
String.fromCodePoint(paddingRange) + String.fromCodePoint(paddingRange + (1 << 8) - 1)
|
||||||
|
]
|
||||||
|
|
||||||
|
export { safeCodePoint, paddingBlockStart, blockStarts, pairStrings }
|
||||||
|
|
||||||
// There are now implementations of
|
// There are now implementations of
|
||||||
// Base65536 in numerous programming languages beyond the original JavaScript,
|
// Base65536 in numerous programming languages beyond the original JavaScript,
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
/* eslint-env jest */
|
/* eslint-env jest */
|
||||||
|
|
||||||
import { paddingBlockStart, blockStarts, safeCodePoint } from './gen'
|
import { paddingBlockStart, blockStarts, safeCodePoint, pairStrings } from './gen'
|
||||||
|
|
||||||
describe('gen', () => {
|
describe('gen', () => {
|
||||||
it('generates the correct padding block', () => {
|
it('generates the correct padding block', () => {
|
||||||
@ -47,4 +47,11 @@ describe('gen', () => {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('generates the right pair strings', () => {
|
||||||
|
expect(pairStrings).toEqual([
|
||||||
|
'㐀䳿一黿ꄀꏿꔀꗿ𐘀𐛿𒀀𒋿𓀀𓏿𔐀𔗿𖠀𖧿𠀀𨗿',
|
||||||
|
'ᔀᗿ'
|
||||||
|
])
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@ -6,6 +6,8 @@
|
|||||||
<script type="module">
|
<script type="module">
|
||||||
import { encode, decode } from '../src/index.js'
|
import { encode, decode } from '../src/index.js'
|
||||||
const encoded = encode(new TextEncoder('utf-8').encode('what the heck is up'))
|
const encoded = encode(new TextEncoder('utf-8').encode('what the heck is up'))
|
||||||
|
const uint8Array = new Uint8Array([119, 104, 97, 116, 32, 116, 104, 101, 32, 104, 101, 99, 107, 32, 105, 115, 32, 117, 112])
|
||||||
|
console.log(encode(uint8Array))
|
||||||
const decoded = new TextDecoder('utf-8').decode(decode(encoded))
|
const decoded = new TextDecoder('utf-8').decode(decode(encoded))
|
||||||
document.querySelector('.root').appendChild(document.createTextNode(decoded))
|
document.querySelector('.root').appendChild(document.createTextNode(decoded))
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@ -15,7 +15,7 @@ const BITS_PER_BYTE = 8
|
|||||||
|
|
||||||
// Compressed representation of inclusive-exclusive ranges of characters used in this encoding.
|
// Compressed representation of inclusive-exclusive ranges of characters used in this encoding.
|
||||||
const pairStrings = [
|
const pairStrings = [
|
||||||
'㐀䳿一黿ꄀꏿꔀꗿ𐘀<EFBFBD>𒀀<EFBFBD>𓀀<EFBFBD>𔐀<EFBFBD>𖠀<EFBFBD>𠀀<EFBFBD>',
|
'㐀䳿一黿ꄀꏿꔀꗿ𐘀𐛿𒀀𒋿𓀀𓏿𔐀𔗿𖠀𖧿𠀀𨗿',
|
||||||
'ᔀᗿ'
|
'ᔀᗿ'
|
||||||
]
|
]
|
||||||
|
|
||||||
@ -34,7 +34,6 @@ pairStrings.forEach((pairString, r) => {
|
|||||||
// SPECIAL CASE: flip the bytes around, because Base65536 was constructed to take the bytes
|
// SPECIAL CASE: flip the bytes around, because Base65536 was constructed to take the bytes
|
||||||
// in the wrong order originally
|
// in the wrong order originally
|
||||||
const z = numZBits === BITS_PER_CHAR ? 256 * (z2 % 256) + (z2 >> 8) : z2
|
const z = numZBits === BITS_PER_CHAR ? 256 * (z2 % 256) + (z2 >> 8) : z2
|
||||||
|
|
||||||
lookupE[numZBits][z] = chr
|
lookupE[numZBits][z] = chr
|
||||||
lookupD[chr] = [numZBits, z]
|
lookupD[chr] = [numZBits, z]
|
||||||
z2++
|
z2++
|
||||||
|
|||||||
@ -31,7 +31,7 @@ describe('base65536', () => {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
describe.only('failure cases', () => {
|
describe('failure cases', () => {
|
||||||
const badFileNames = glob.sync('./node_modules/base65536-test/data/bad/**/*.txt')
|
const badFileNames = glob.sync('./node_modules/base65536-test/data/bad/**/*.txt')
|
||||||
|
|
||||||
badFileNames.forEach(fileName => {
|
badFileNames.forEach(fileName => {
|
||||||
@ -73,4 +73,13 @@ describe('base65536', () => {
|
|||||||
const ascii2 = String.fromCharCode(...uint8Array2)
|
const ascii2 = String.fromCharCode(...uint8Array2)
|
||||||
expect(ascii2).toBe('some ASCII text')
|
expect(ascii2).toBe('some ASCII text')
|
||||||
})
|
})
|
||||||
|
|
||||||
|
it('bug', () => {
|
||||||
|
const ascii = 'what the heck is up'
|
||||||
|
const uint8Array = Uint8Array.from(ascii, chr => chr.charCodeAt(0))
|
||||||
|
const str = encode(uint8Array)
|
||||||
|
const uint8Array2 = decode(str)
|
||||||
|
const ascii2 = String.fromCharCode(...uint8Array2)
|
||||||
|
expect(ascii2).toBe('what the heck is up')
|
||||||
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user