@@ -2,7 +2,8 @@ import lcm from './lcm'
22import WeakMap from 'weak-map'
33
44const propMap = new WeakMap ( )
5- const bitsPerByte = 8
5+
6+ const BITS_PER_BYTE = 8
67
78export default class CharSet {
89 constructor ( chars ) {
@@ -28,7 +29,7 @@ export default class CharSet {
2829 bitsPerChar,
2930 length,
3031 ndxFn : _ndxFn ( bitsPerChar ) ,
31- charsPerChunk : lcm ( bitsPerChar , bitsPerByte ) / bitsPerChar
32+ charsPerChunk : lcm ( bitsPerChar , BITS_PER_BYTE ) / bitsPerChar
3233 }
3334 propMap . set ( this , privProps )
3435 }
@@ -57,38 +58,44 @@ export default class CharSet {
5758 return propMap . get ( this ) . ndxFn
5859 }
5960
61+ bytesNeeded ( entropyBits ) {
62+ const count = Math . ceil ( entropyBits / this . bitsPerChar ( ) )
63+ return Math . ceil ( count * this . bitsPerChar ( ) / BITS_PER_BYTE )
64+ }
65+
6066 // Aliases
6167 chars ( ) { return this . getChars ( ) }
6268 ndxFn ( ) { return this . getNdxFn ( ) }
69+ bitsPerChar ( ) { return this . getBitsPerChar ( ) }
6370}
6471
6572const _ndxFn = ( bitsPerChar ) => {
66- // If bitsPerBytes is a multiple of bitsPerChar, we can slice off an integer number
73+ // If BITS_PER_BYTEs is a multiple of bitsPerChar, we can slice off an integer number
6774 // of chars per byte.
68- if ( lcm ( bitsPerChar , bitsPerByte ) === bitsPerByte ) {
75+ if ( lcm ( bitsPerChar , BITS_PER_BYTE ) === BITS_PER_BYTE ) {
6976 return function ( chunk , slice , bytes ) {
7077 let lShift = bitsPerChar
71- let rShift = bitsPerByte - bitsPerChar
78+ let rShift = BITS_PER_BYTE - bitsPerChar
7279 return ( ( bytes [ chunk ] << ( lShift * slice ) ) & 0xff ) >> rShift
7380 }
7481 }
7582 // Otherwise, while slicing off bits per char, we will possibly straddle a couple
7683 // of bytes, so a bit more work is involved
7784 else {
7885 return function ( chunk , slice , bytes ) {
79- let slicesPerChunk = lcm ( bitsPerChar , bitsPerByte ) / bitsPerByte
86+ let slicesPerChunk = lcm ( bitsPerChar , BITS_PER_BYTE ) / BITS_PER_BYTE
8087 let bNum = chunk * slicesPerChunk
8188
82- let offset = ( slice * bitsPerChar ) / bitsPerByte
89+ let offset = ( slice * bitsPerChar ) / BITS_PER_BYTE
8390 let lOffset = Math . floor ( offset )
8491 let rOffset = Math . ceil ( offset )
8592
86- let rShift = bitsPerByte - bitsPerChar
87- let lShift = ( slice * bitsPerChar ) % bitsPerByte
93+ let rShift = BITS_PER_BYTE - bitsPerChar
94+ let lShift = ( slice * bitsPerChar ) % BITS_PER_BYTE
8895
8996 let ndx = ( ( bytes [ bNum + lOffset ] << lShift ) & 0xff ) >> rShift
9097
91- let rShiftIt = ( ( rOffset + 1 ) * bitsPerByte - ( slice + 1 ) * bitsPerChar ) % bitsPerByte
98+ let rShiftIt = ( ( rOffset + 1 ) * BITS_PER_BYTE - ( slice + 1 ) * bitsPerChar ) % BITS_PER_BYTE
9299 if ( rShift < rShiftIt ) {
93100 ndx += bytes [ bNum + rOffset ] >> rShiftIt
94101 }
0 commit comments