@ddunigma/node 2.0.1 → 2.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENCE +1 -1
  2. package/README.md +304 -46
  3. package/dist/cjs/base/BaseDdu.d.ts +35 -9
  4. package/dist/cjs/base/BaseDdu.js +14 -39
  5. package/dist/cjs/charSets/index.d.ts +14 -0
  6. package/dist/cjs/charSets/index.js +4292 -4248
  7. package/dist/cjs/encoders/Ddu64.d.ts +264 -10
  8. package/dist/cjs/encoders/Ddu64.js +1047 -205
  9. package/dist/cjs/encoders/index.js +0 -1
  10. package/dist/cjs/index.d.ts +2 -1
  11. package/dist/cjs/index.js +8 -4
  12. package/dist/cjs/types/DduDefaultTypes.js +5 -0
  13. package/dist/cjs/types/DduInterface.d.ts +72 -5
  14. package/dist/cjs/utils/CharsetBuilder.d.ts +129 -0
  15. package/dist/cjs/utils/CharsetBuilder.js +246 -0
  16. package/dist/cjs/utils/DduPipeline.d.ts +114 -0
  17. package/dist/cjs/utils/DduPipeline.js +229 -0
  18. package/dist/cjs/utils/DduStream.d.ts +64 -0
  19. package/dist/cjs/utils/DduStream.js +221 -0
  20. package/dist/cjs/utils/crypto.d.ts +30 -0
  21. package/dist/cjs/utils/crypto.js +84 -0
  22. package/dist/cjs/utils/index.d.ts +3 -0
  23. package/dist/cjs/utils/index.js +12 -0
  24. package/dist/mjs/base/BaseDdu.d.ts +35 -9
  25. package/dist/mjs/base/BaseDdu.js +14 -39
  26. package/dist/mjs/base/index.js +1 -1
  27. package/dist/mjs/charSets/index.d.ts +14 -0
  28. package/dist/mjs/charSets/index.js +4293 -4249
  29. package/dist/mjs/encoders/Ddu64.d.ts +264 -10
  30. package/dist/mjs/encoders/Ddu64.js +1080 -211
  31. package/dist/mjs/encoders/index.js +1 -2
  32. package/dist/mjs/index.d.ts +2 -1
  33. package/dist/mjs/index.js +4 -6
  34. package/dist/mjs/types/DduDefaultTypes.js +6 -1
  35. package/dist/mjs/types/DduInterface.d.ts +72 -5
  36. package/dist/mjs/types/index.js +3 -3
  37. package/dist/mjs/utils/CharsetBuilder.d.ts +129 -0
  38. package/dist/mjs/utils/CharsetBuilder.js +241 -0
  39. package/dist/mjs/utils/DduPipeline.d.ts +114 -0
  40. package/dist/mjs/utils/DduPipeline.js +223 -0
  41. package/dist/mjs/utils/DduStream.d.ts +64 -0
  42. package/dist/mjs/utils/DduStream.js +225 -0
  43. package/dist/mjs/utils/crypto.d.ts +30 -0
  44. package/dist/mjs/utils/crypto.js +78 -0
  45. package/dist/mjs/utils/index.d.ts +3 -0
  46. package/dist/mjs/utils/index.js +3 -0
  47. package/package.json +15 -8
package/LICENCE CHANGED
@@ -1,4 +1,4 @@
1
- Copyright 2025 i3l3
1
+ Copyright 2025 junhypar
2
2
 
3
3
  Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:
4
4
 
package/README.md CHANGED
@@ -1,10 +1,13 @@
1
- ## ddunigma Node
1
+ ## ddunigma Node
2
+
2
3
  [![npm version](https://badge.fury.io/js/@ddunigma%2Fnode.svg)](https://www.npmjs.com/package/@ddunigma/node)
3
4
 
4
- ## Overview
5
+ ## Overview
5
6
 
6
7
  Node.js implementation of [ddunigma](https://github.com/i3l3/ddunigma) (Python original)
7
8
 
9
+ 커스텀 charset을 사용하는 Base64 스타일 인코더/디코더 라이브러리입니다.
10
+
8
11
  ### Credits
9
12
 
10
13
  - Original Python Implementation by:
@@ -24,7 +27,7 @@ npm install @ddunigma/node
24
27
 
25
28
  ## Usage
26
29
 
27
- ### 간단한 문자열 인코딩/디코딩
30
+ ### 기본 인코딩/디코딩
28
31
 
29
32
  ```typescript
30
33
  import { Ddu64 } from "@ddunigma/node";
@@ -46,88 +49,343 @@ console.log(decoded); // "Hello World!"
46
49
  import { Ddu64, DduSetSymbol } from "@ddunigma/node";
47
50
 
48
51
  // ONECHARSET (64개 문자)
49
- const encoder1 = new Ddu64(undefined, undefined, {
50
- dduSetSymbol: DduSetSymbol.ONECHARSET
52
+ const encoder1 = new Ddu64(undefined, undefined, {
53
+ dduSetSymbol: DduSetSymbol.ONECHARSET,
51
54
  });
52
55
 
53
56
  // DDU (8개 문자)
54
- const encoder2 = new Ddu64(undefined, undefined, {
55
- dduSetSymbol: DduSetSymbol.DDU
57
+ const encoder2 = new Ddu64(undefined, undefined, {
58
+ dduSetSymbol: DduSetSymbol.DDU,
56
59
  });
57
60
 
58
61
  // TWOCHARSET (1024개 문자)
59
- const encoder3 = new Ddu64(undefined, undefined, {
60
- dduSetSymbol: DduSetSymbol.TWOCHARSET
62
+ const encoder3 = new Ddu64(undefined, undefined, {
63
+ dduSetSymbol: DduSetSymbol.TWOCHARSET,
61
64
  });
62
65
 
63
66
  // THREECHARSET (32768개 문자)
64
- const encoder4 = new Ddu64(undefined, undefined, {
65
- dduSetSymbol: DduSetSymbol.THREECHARSET
67
+ const encoder4 = new Ddu64(undefined, undefined, {
68
+ dduSetSymbol: DduSetSymbol.THREECHARSET,
66
69
  });
67
70
 
68
71
  const text = "안녕하세요";
69
72
  const encoded = encoder1.encode(text);
70
73
  const decoded = encoder1.decode(encoded);
71
- const decodedBuffer = encoder1.decodeToBuffer(encoded);
72
74
  ```
73
75
 
74
- ### 커스텀 Charset 사용
76
+ ### 압축 인코딩
75
77
 
76
78
  ```typescript
77
79
  import { Ddu64 } from "@ddunigma/node";
78
80
 
79
- const koreanChars = [
80
- "뜌", "뜍", "뜎", "뜏", "뜐", "뜑", "뜒", "뜓", "뜔", "뜕", "뜖", "뜗", "뜘", "뜙", "뜚", "뜛",
81
- "뜜", "뜝", "뜞", "뜟", "뜠", "뜡", "뜢", "뜣", "뜤", "뜥", "뜦", "뜧", "뜨", "뜩", "뜪", "뜫",
82
- // ... 256개 문자
83
- ];
81
+ // 생성자에서 기본 압축 활성화
82
+ const encoder = new Ddu64(undefined, undefined, {
83
+ compress: true,
84
+ });
85
+
86
+ // 또는 encode 호출 시 압축 옵션 지정
87
+ const text = "반복되는 긴 텍스트...".repeat(100);
88
+ const encoded = encoder.encode(text, { compress: true });
89
+ const decoded = encoder.decode(encoded); // 자동으로 압축 해제
90
+ ```
84
91
 
85
- const encoder = new Ddu64(koreanChars, "뭐");
92
+ ### URL-Safe 인코딩
86
93
 
87
- const text = "안녕하세요12";
88
- const encoded = encoder.encode(text);
89
- const decoded = encoder.decode(encoded);
90
- const decodedBuffer = encoder.decodeToBuffer(encoded);
94
+ ```typescript
95
+ import { Ddu64 } from "@ddunigma/node";
96
+
97
+ const encoder = new Ddu64(undefined, undefined, {
98
+ dduSetSymbol: DduSetSymbol.ONECHARSET,
99
+ urlSafe: true, // +, /, = 를 URL 안전 문자로 변환
100
+ });
101
+
102
+ const encoded = encoder.encode("Hello World!");
103
+ // URL에서 안전하게 사용 가능한 문자열 반환
104
+ ```
105
+
106
+ ### 체크섬 (무결성 검증)
107
+
108
+ ```typescript
109
+ import { Ddu64 } from "@ddunigma/node";
110
+
111
+ const encoder = new Ddu64(undefined, undefined, {
112
+ checksum: true, // CRC32 체크섬 활성화
113
+ });
114
+
115
+ const encoded = encoder.encode("Important data", { checksum: true });
116
+ const decoded = encoder.decode(encoded); // 자동으로 체크섬 검증
117
+ // 체크섬 불일치 시 에러 발생
118
+ ```
119
+
120
+ ### 암호화
121
+
122
+ ```typescript
123
+ import { Ddu64 } from "@ddunigma/node";
124
+
125
+ const encoder = new Ddu64(undefined, undefined, {
126
+ encryptionKey: "my-secret-key-123", // AES-256-GCM 암호화
127
+ });
128
+
129
+ const encoded = encoder.encode("Secret message!");
130
+ const decoded = encoder.decode(encoded); // 자동으로 복호화
131
+ ```
132
+
133
+ ### 청크 분할
134
+
135
+ ```typescript
136
+ import { Ddu64 } from "@ddunigma/node";
137
+
138
+ const encoder = new Ddu64();
139
+
140
+ const encoded = encoder.encode(longData, {
141
+ chunkSize: 76, // 76자마다 분할
142
+ chunkSeparator: "\n", // 줄바꿈으로 구분
143
+ });
144
+ // 결과: "ABCDxyz...\nEFGHijk...\n..."
145
+
146
+ const decoded = encoder.decode(encoded); // 자동으로 줄바꿈 제거
147
+ ```
148
+
149
+ ### 비동기 인코딩/디코딩
150
+
151
+ ```typescript
152
+ import { Ddu64 } from "@ddunigma/node";
153
+
154
+ const encoder = new Ddu64();
155
+
156
+ // 비동기 인코딩 (이벤트 루프 블로킹 방지)
157
+ const encoded = await encoder.encodeAsync(largeData);
158
+ const decoded = await encoder.decodeAsync(encoded);
159
+ const buffer = await encoder.decodeToBufferAsync(encoded);
160
+ ```
161
+
162
+ ### 진행률 콜백
163
+
164
+ ```typescript
165
+ import { Ddu64 } from "@ddunigma/node";
166
+
167
+ const encoder = new Ddu64();
168
+
169
+ encoder.encode(largeData, {
170
+ onProgress: (info) => {
171
+ console.log(`진행률: ${info.percent}%`);
172
+ console.log(`처리됨: ${info.processedBytes}/${info.totalBytes}`);
173
+ },
174
+ });
91
175
  ```
92
176
 
93
- ## API
177
+ ### 통계/분석
178
+
179
+ ```typescript
180
+ import { Ddu64 } from "@ddunigma/node";
181
+
182
+ const encoder = new Ddu64();
183
+
184
+ const stats = encoder.getStats("Test data", { compress: true });
185
+ console.log(stats);
186
+ // {
187
+ // originalSize: 9,
188
+ // encodedSize: 12,
189
+ // compressedSize: 17,
190
+ // compressionRatio: 1.89,
191
+ // expansionRatio: 1.33,
192
+ // charsetSize: 64,
193
+ // bitLength: 6
194
+ // }
195
+ ```
196
+
197
+ ### Zip Bomb 방어
198
+
199
+ ```typescript
200
+ import { Ddu64 } from "@ddunigma/node";
201
+
202
+ const encoder = new Ddu64(undefined, undefined, {
203
+ maxDecodedBytes: 10 * 1024 * 1024, // 10MB
204
+ maxDecompressedBytes: 50 * 1024 * 1024, // 50MB
205
+ });
206
+
207
+ // 제한 초과 시 에러 발생
208
+ ```
209
+
210
+ ---
211
+
212
+ ## CharsetBuilder
213
+
214
+ 커스텀 charset을 쉽게 생성할 수 있는 빌더 유틸리티입니다.
215
+
216
+ ```typescript
217
+ import { CharsetBuilder } from "@ddunigma/node";
218
+
219
+ // 유니코드 범위에서 생성
220
+ const chars1 = CharsetBuilder.fromUnicodeRange(0x4e00, 0x4e3f).build();
221
+
222
+ // Base64 문자셋
223
+ const chars2 = CharsetBuilder.base64().build();
224
+
225
+ // 혼동 문자 제외 (0, O, 1, l, I 등)
226
+ const chars3 = CharsetBuilder.base64().excludeConfusing().build();
227
+
228
+ // 2의 제곱수로 제한
229
+ const chars4 = CharsetBuilder.fromString("ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
230
+ .limitToPowerOfTwo()
231
+ .build(); // 32자
232
+
233
+ // URL 안전 문자만
234
+ const chars5 = CharsetBuilder.base64().excludeUrlUnsafe().build();
235
+
236
+ // 시드 기반 셔플
237
+ const chars6 = CharsetBuilder.base64().shuffle(12345).build();
238
+
239
+ // 패딩 문자와 함께 빌드
240
+ const { charset, padding } = CharsetBuilder.base64().buildWithPadding();
241
+ ```
242
+
243
+ ---
244
+
245
+ ## DduPipeline
246
+
247
+ 다단계 인코딩/암호화/압축을 조합할 수 있는 파이프라인 빌더입니다.
248
+
249
+ ```typescript
250
+ import { DduPipeline, Ddu64 } from "@ddunigma/node";
251
+
252
+ const encoder = new Ddu64();
253
+
254
+ // 압축 → 암호화 → 인코딩 파이프라인
255
+ const pipeline = new DduPipeline()
256
+ .compress()
257
+ .encrypt("my-secret-key")
258
+ .encode(encoder);
259
+
260
+ const encoded = pipeline.processToString("Hello World!");
261
+
262
+ // 역순 파이프라인으로 복원
263
+ const decoded = pipeline.reverse().processToString(encoded);
264
+ ```
265
+
266
+ ---
267
+
268
+ ## 스트림 지원
269
+
270
+ 대용량 파일 처리를 위한 스트림 인코딩/디코딩을 지원합니다.
271
+
272
+ ```typescript
273
+ import { Ddu64, createEncodeStream, createDecodeStream } from "@ddunigma/node";
274
+ import fs from "fs";
275
+
276
+ const encoder = new Ddu64();
277
+
278
+ // 인코딩 스트림
279
+ fs.createReadStream("input.bin")
280
+ .pipe(createEncodeStream(encoder))
281
+ .pipe(fs.createWriteStream("output.txt"));
282
+
283
+ // 디코딩 스트림
284
+ fs.createReadStream("output.txt")
285
+ .pipe(createDecodeStream(encoder))
286
+ .pipe(fs.createWriteStream("restored.bin"));
287
+ ```
288
+
289
+ ---
290
+
291
+ ## API Reference
94
292
 
95
293
  ### `new Ddu64(dduChar?, paddingChar?, options?)`
96
294
 
97
295
  인코더 인스턴스를 생성합니다.
98
296
 
99
297
  **Parameters:**
100
- - `dduChar` (string | string[]): charset 문자열 또는 배열
101
- - `paddingChar` (string): 패딩 문자
102
- - `options` (DduOptions): 옵션 객체
103
- - `dduSetSymbol`: 미리 정의된 charset 사용
104
- - `encoding`: Buffer encoding (기본값: 'utf-8')
105
- - `usePowerOfTwo`: 2의 제곱수 강제 여부
106
- - `useBuildErrorReturn`: 에러 발생 시 throw 여부
107
298
 
108
- ### `encode(data: string | Buffer): string`
299
+ | Parameter | Type | Description |
300
+ | ------------- | ----------------------- | ------------------------ |
301
+ | `dduChar` | `string \| string[]` | charset 문자열 또는 배열 |
302
+ | `paddingChar` | `string` | 패딩 문자 |
303
+ | `options` | `DduConstructorOptions` | 옵션 객체 |
304
+
305
+ **DduConstructorOptions:**
306
+
307
+ | Option | Type | Default | Description |
308
+ | ---------------------- | ---------------- | ----------- | --------------------------- |
309
+ | `dduSetSymbol` | `DduSetSymbol` | `DDU` | 미리 정의된 charset 심볼 |
310
+ | `encoding` | `BufferEncoding` | `'utf-8'` | 문자열 인코딩 |
311
+ | `usePowerOfTwo` | `boolean` | `true` | 2의 제곱수 강제 여부 |
312
+ | `useBuildErrorReturn` | `boolean` | `false` | 에러 발생 시 throw 여부 |
313
+ | `compress` | `boolean` | `false` | 기본 압축 활성화 |
314
+ | `maxDecodedBytes` | `number` | `67108864` | 최대 디코딩 바이트 (64MB) |
315
+ | `maxDecompressedBytes` | `number` | `67108864` | 최대 압축해제 바이트 (64MB) |
316
+ | `urlSafe` | `boolean` | `false` | URL-Safe 모드 |
317
+ | `encryptionKey` | `string` | `undefined` | AES-256-GCM 암호화 키 |
318
+ | `checksum` | `boolean` | `false` | CRC32 체크섬 활성화 |
319
+ | `chunkSize` | `number` | `undefined` | 청크 분할 크기 |
320
+ | `chunkSeparator` | `string` | `'\n'` | 청크 구분자 |
321
+
322
+ ### `encode(data, options?): string`
323
+
324
+ 데이터를 인코딩합니다.
325
+
326
+ **DduOptions:**
327
+
328
+ | Option | Type | Description |
329
+ | ---------------- | ---------- | ---------------- |
330
+ | `compress` | `boolean` | 압축 사용 여부 |
331
+ | `checksum` | `boolean` | 체크섬 추가 여부 |
332
+ | `chunkSize` | `number` | 청크 분할 크기 |
333
+ | `chunkSeparator` | `string` | 청크 구분자 |
334
+ | `onProgress` | `function` | 진행률 콜백 |
109
335
 
110
- 데이터를 인코딩
336
+ ### `decode(encoded, options?): string`
111
337
 
112
- ### `decode(encoded: string): string`
338
+ 인코딩된 문자열을 디코딩합니다.
113
339
 
114
- 인코딩된 문자열을 디코딩
340
+ ### `decodeToBuffer(encoded, options?): Buffer`
115
341
 
116
- ### `decodeToBuffer(encoded: string): Buffer`
342
+ 인코딩된 문자열을 Buffer로 직접 디코딩합니다.
117
343
 
118
- 인코딩된 문자열을 Buffer로 직접 디코딩
344
+ ### `encodeAsync(data, options?): Promise<string>`
119
345
 
120
- ### `getCharSetInfo()`
346
+ 비동기로 데이터를 인코딩합니다.
121
347
 
122
- 현재 charset 정보를 반환
348
+ ### `decodeAsync(encoded, options?): Promise<string>`
349
+
350
+ 비동기로 데이터를 디코딩합니다.
351
+
352
+ ### `decodeToBufferAsync(encoded, options?): Promise<Buffer>`
353
+
354
+ 비동기로 Buffer로 디코딩합니다.
355
+
356
+ ### `getStats(data, options?): DduEncodeStats`
357
+
358
+ 인코딩 통계 정보를 반환합니다.
123
359
 
124
360
  ```typescript
125
361
  {
126
- charSet: string[];
127
- paddingChar: string;
128
- charLength: number;
129
- bitLength: number;
130
- usePowerOfTwo: boolean;
131
- encoding: BufferEncoding;
362
+ originalSize: number; // 원본 데이터 크기
363
+ encodedSize: number; // 인코딩된 문자열 길이
364
+ compressedSize?: number; // 압축된 크기
365
+ compressionRatio?: number; // 압축률 (0-1)
366
+ expansionRatio: number; // 인코딩 확장 비율
367
+ charsetSize: number; // charset 크기
368
+ bitLength: number; // 비트 길이
132
369
  }
133
- ```
370
+ ```
371
+
372
+ ### `getCharSetInfo(): CharSetInfo`
373
+
374
+ 현재 인코더의 charset 정보를 반환합니다.
375
+
376
+ ---
377
+
378
+ ## DduSetSymbol
379
+
380
+ | Symbol | 문자 수 | 비트 길이 | 설명 |
381
+ | -------------- | ------- | --------- | ------------------------- |
382
+ | `DDU` | 8 | 3 | 한글 + 특수문자 기본 세트 |
383
+ | `ONECHARSET` | 64 | 6 | 영문 + 숫자 + 특수문자 |
384
+ | `TWOCHARSET` | 1024 | 10 | 2글자 조합 세트 |
385
+ | `THREECHARSET` | 32768 | 15 | 3글자 조합 세트 |
386
+
387
+ ---
388
+
389
+ ## License
390
+
391
+ BSD-2-Clause
@@ -1,20 +1,46 @@
1
- import { DduOptions, BufferToDduBinaryResult } from "../types";
1
+ import { DduOptions } from "../types";
2
2
  export declare abstract class BaseDdu {
3
3
  protected readonly defaultEncoding: BufferEncoding;
4
- protected readonly binaryLookup: string[];
5
- protected escapeRegExp(str: string): string;
6
- protected splitString(s: string, length: number): Generator<string>;
7
- protected getLargestPowerOfTwo(n: number): number;
4
+ /**
5
+ * 주어진 숫자보다 작거나 같은 가장 큰 2의 제곱수의 지수를 반환합니다.
6
+ * @param n - 대상 숫자
7
+ * @returns 2의 제곱수 지수 (예: n=8 → 3, n=64 → 6)
8
+ * @example getLargestPowerOfTwoExponent(8) // 3
9
+ * @example getLargestPowerOfTwoExponent(100) // 6
10
+ */
8
11
  protected getLargestPowerOfTwoExponent(n: number): number;
12
+ /**
13
+ * charset 크기에 필요한 비트 길이를 계산합니다.
14
+ * @param setLength - charset 문자 수
15
+ * @returns 필요한 비트 수
16
+ * @example getBitLength(64) // 6
17
+ * @example getBitLength(100) // 7
18
+ */
9
19
  protected getBitLength(setLength: number): number;
10
- protected bufferToDduBinary(input: Buffer, bitLength: number): BufferToDduBinaryResult;
11
- protected dduBinaryToBuffer(decodedBin: string, paddingBits: number): Buffer;
20
+ /**
21
+ * 입력 데이터를 인코딩합니다.
22
+ * @param input - 인코딩할 문자열 또는 Buffer
23
+ * @param options - 인코딩 옵션
24
+ * @returns 인코딩된 문자열
25
+ */
12
26
  abstract encode(input: Buffer | string, options?: DduOptions): string;
27
+ /**
28
+ * 인코딩된 문자열을 Buffer로 디코딩합니다.
29
+ * @param input - 인코딩된 문자열
30
+ * @param options - 디코딩 옵션
31
+ * @returns 디코딩된 Buffer
32
+ */
13
33
  abstract decodeToBuffer(input: string, options?: DduOptions): Buffer;
34
+ /**
35
+ * 인코딩된 문자열을 원본 문자열로 디코딩합니다.
36
+ * @param input - 인코딩된 문자열
37
+ * @param options - 디코딩 옵션
38
+ * @returns 디코딩된 문자열
39
+ */
14
40
  abstract decode(input: string, options?: DduOptions): string;
15
41
  /**
16
- * 테스트 디버깅용 추상 메서드
17
- * 구현 클래스의 내부 상태 정보를 반환
42
+ * 현재 인코더의 charset 정보를 반환합니다.
43
+ * @returns charset 설정 정보 객체
18
44
  */
19
45
  abstract getCharSetInfo(): {
20
46
  charSet: string[];
@@ -4,51 +4,26 @@ exports.BaseDdu = void 0;
4
4
  class BaseDdu {
5
5
  constructor() {
6
6
  this.defaultEncoding = "utf-8";
7
- this.binaryLookup = Array.from({ length: 256 }, (_, i) => i.toString(2).padStart(8, "0"));
8
- }
9
- escapeRegExp(str) {
10
- return str.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
- }
12
- *splitString(s, length) {
13
- for (let i = 0; i < s.length; i += length) {
14
- yield s.slice(i, Math.min(i + length, s.length));
15
- }
16
- }
17
- getLargestPowerOfTwo(n) {
18
- return 2 ** Math.floor(Math.log2(n));
19
7
  }
8
+ /**
9
+ * 주어진 숫자보다 작거나 같은 가장 큰 2의 제곱수의 지수를 반환합니다.
10
+ * @param n - 대상 숫자
11
+ * @returns 2의 제곱수 지수 (예: n=8 → 3, n=64 → 6)
12
+ * @example getLargestPowerOfTwoExponent(8) // 3
13
+ * @example getLargestPowerOfTwoExponent(100) // 6
14
+ */
20
15
  getLargestPowerOfTwoExponent(n) {
21
16
  return Math.floor(Math.log2(n));
22
17
  }
18
+ /**
19
+ * charset 크기에 필요한 비트 길이를 계산합니다.
20
+ * @param setLength - charset 문자 수
21
+ * @returns 필요한 비트 수
22
+ * @example getBitLength(64) // 6
23
+ * @example getBitLength(100) // 7
24
+ */
23
25
  getBitLength(setLength) {
24
26
  return Math.ceil(Math.log2(setLength));
25
27
  }
26
- bufferToDduBinary(input, bitLength) {
27
- // 성능 최적화: reduce 대신 for loop + join 사용
28
- if (input.length === 0) {
29
- return { dduBinary: [], padding: 0 };
30
- }
31
- const binaryParts = new Array(input.length);
32
- for (let i = 0; i < input.length; i++) {
33
- binaryParts[i] = this.binaryLookup[input[i]];
34
- }
35
- const encodedBin = binaryParts.join("");
36
- const dduBinary = Array.from(this.splitString(encodedBin, bitLength));
37
- const padding = bitLength - dduBinary[dduBinary.length - 1].length;
38
- if (padding > 0) {
39
- dduBinary[dduBinary.length - 1] += "0".repeat(padding);
40
- }
41
- return { dduBinary, padding };
42
- }
43
- dduBinaryToBuffer(decodedBin, paddingBits) {
44
- if (paddingBits > 0) {
45
- decodedBin = decodedBin.slice(0, -paddingBits);
46
- }
47
- const buffer = [];
48
- for (let i = 0; i < decodedBin.length; i += 8) {
49
- buffer.push(parseInt(decodedBin.slice(i, i + 8), 2));
50
- }
51
- return Buffer.from(buffer);
52
- }
53
28
  }
54
29
  exports.BaseDdu = BaseDdu;
@@ -1,4 +1,18 @@
1
1
  import { CharSetConfig, DduSetSymbol } from "../types";
2
+ /**
3
+ * 심볼에 해당하는 charset 설정을 반환합니다.
4
+ * @param symbol - charset 심볼
5
+ * @returns CharSetConfig 또는 undefined
6
+ */
2
7
  export declare function getCharSet(symbol: DduSetSymbol): CharSetConfig | undefined;
8
+ /**
9
+ * 모든 사용 가능한 charset 심볼 목록을 반환합니다.
10
+ * @returns DduSetSymbol 배열
11
+ */
3
12
  export declare function getAllSymbols(): DduSetSymbol[];
13
+ /**
14
+ * 해당 심볼의 charset이 존재하는지 확인합니다.
15
+ * @param symbol - 확인할 charset 심볼
16
+ * @returns 존재 여부
17
+ */
4
18
  export declare function hasCharSet(symbol: DduSetSymbol): boolean;