Skip to content

Commit 66fb42e

Browse files
committed
Refactor Base32768Encoder and Decoder to use Unicode ranges for encoding tables
1 parent 8ce9ad5 commit 66fb42e

2 files changed

Lines changed: 50 additions & 88 deletions

File tree

src/main/java/net/eewbot/base32768j/Base32768Decoder.java

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,25 +27,25 @@ public class Base32768Decoder {
2727
static {
2828
Arrays.fill(DECODE, INVALID);
2929

30-
// 7-bit blocks(末尾のみ有効)
31-
for (int i = 0; i < Base32768Encoder.CODES_7.length; i++) {
32-
int base = i << 5; // 0..127
33-
int cp0 = Base32768Encoder.CODES_7[i];
34-
LAST_BITS[cp0 >> 5] = 7;
35-
for (int lo = 0; lo < 32; lo++) {
36-
int cp = cp0 + lo;
37-
DECODE[cp] = (char) (FLAG7 | (base + lo)); // bit15=1 を7bitフラグに
30+
// Build reverse lookup tables from Unicode ranges
31+
int idx = 0;
32+
33+
// 7-bit blocks (valid only at end of input)
34+
for (int[] range : Base32768Encoder.CODES_7_RANGES) {
35+
for (int cp = range[0]; cp <= range[1]; cp++) {
36+
DECODE[cp] = (char) (FLAG7 | idx);
37+
LAST_BITS[cp >> 5] = 7;
38+
idx++;
3839
}
3940
}
4041

41-
// 15-bit blocks(非末尾/末尾とも有効)
42-
for (int i = 0; i < Base32768Encoder.CODES_15.length; i++) {
43-
int base = i << 5; // 0..32767
44-
int cp0 = Base32768Encoder.CODES_15[i];
45-
LAST_BITS[cp0 >> 5] = 15;
46-
for (int lo = 0; lo < 32; lo++) {
47-
int cp = cp0 + lo;
48-
DECODE[cp] = (char) (base + lo); // bit15=0
42+
// 15-bit blocks (valid anywhere)
43+
idx = 0;
44+
for (int[] range : Base32768Encoder.CODES_15_RANGES) {
45+
for (int cp = range[0]; cp <= range[1]; cp++) {
46+
DECODE[cp] = (char) idx;
47+
LAST_BITS[cp >> 5] = 15;
48+
idx++;
4949
}
5050
}
5151
}

src/main/java/net/eewbot/base32768j/Base32768Encoder.java

Lines changed: 34 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -19,87 +19,49 @@
1919
public class Base32768Encoder {
2020
Base32768Encoder() {}
2121

22-
static final char[] CODES_7 = {0x180, 0x240, 0x260, 0x280};
23-
// region CODES_15
24-
static final char[] CODES_15 = {
25-
0x4a0, 0x500, 0x680, 0x6a0, 0x760, 0x780, 0x7c0, 0x1000, 0x10a0, 0x1100, 0x1120, 0x1140, 0x1180, 0x11e0, 0x1200, 0x1220,
26-
0x1260, 0x12e0, 0x1320, 0x13a0, 0x13c0, 0x1420, 0x1440, 0x1460, 0x1480, 0x14a0, 0x14c0, 0x14e0, 0x1500, 0x1520, 0x1540, 0x1560,
27-
0x1580, 0x15a0, 0x15c0, 0x15e0, 0x1600, 0x1620, 0x1640, 0x16a0, 0x16c0, 0x1780, 0x1820, 0x1840, 0x18c0, 0x1980, 0x19e0, 0x1a20,
28-
0x1bc0, 0x1c00, 0x1d00, 0x21e0, 0x22c0, 0x2340, 0x2360, 0x2380, 0x23a0, 0x23c0, 0x2400, 0x2500, 0x2520, 0x2540, 0x2560, 0x2580,
29-
0x25a0, 0x25c0, 0x25e0, 0x2600, 0x2620, 0x2640, 0x2660, 0x2680, 0x26a0, 0x26c0, 0x26e0, 0x2700, 0x2720, 0x2740, 0x2780, 0x27a0,
30-
0x2800, 0x2820, 0x2840, 0x2860, 0x2880, 0x28a0, 0x28c0, 0x28e0, 0x2900, 0x2920, 0x2940, 0x2960, 0x29a0, 0x2a20, 0x2a40, 0x2a80,
31-
0x2aa0, 0x2ae0, 0x2b00, 0x2b20, 0x2b40, 0x2c00, 0x2c80, 0x2ca0, 0x2cc0, 0x2d00, 0x2d40, 0x2ea0, 0x2ec0, 0x31c0, 0x3400, 0x3420,
32-
0x3440, 0x3460, 0x3480, 0x34a0, 0x34c0, 0x34e0, 0x3500, 0x3520, 0x3540, 0x3560, 0x3580, 0x35a0, 0x35c0, 0x35e0, 0x3600, 0x3620,
33-
0x3640, 0x3660, 0x3680, 0x36a0, 0x36c0, 0x36e0, 0x3700, 0x3720, 0x3740, 0x3760, 0x3780, 0x37a0, 0x37c0, 0x37e0, 0x3800, 0x3820,
34-
0x3840, 0x3860, 0x3880, 0x38a0, 0x38c0, 0x38e0, 0x3900, 0x3920, 0x3940, 0x3960, 0x3980, 0x39a0, 0x39c0, 0x39e0, 0x3a00, 0x3a20,
35-
0x3a40, 0x3a60, 0x3a80, 0x3aa0, 0x3ac0, 0x3ae0, 0x3b00, 0x3b20, 0x3b40, 0x3b60, 0x3b80, 0x3ba0, 0x3bc0, 0x3be0, 0x3c00, 0x3c20,
36-
0x3c40, 0x3c60, 0x3c80, 0x3ca0, 0x3cc0, 0x3ce0, 0x3d00, 0x3d20, 0x3d40, 0x3d60, 0x3d80, 0x3da0, 0x3dc0, 0x3de0, 0x3e00, 0x3e20,
37-
0x3e40, 0x3e60, 0x3e80, 0x3ea0, 0x3ec0, 0x3ee0, 0x3f00, 0x3f20, 0x3f40, 0x3f60, 0x3f80, 0x3fa0, 0x3fc0, 0x3fe0, 0x4000, 0x4020,
38-
0x4040, 0x4060, 0x4080, 0x40a0, 0x40c0, 0x40e0, 0x4100, 0x4120, 0x4140, 0x4160, 0x4180, 0x41a0, 0x41c0, 0x41e0, 0x4200, 0x4220,
39-
0x4240, 0x4260, 0x4280, 0x42a0, 0x42c0, 0x42e0, 0x4300, 0x4320, 0x4340, 0x4360, 0x4380, 0x43a0, 0x43c0, 0x43e0, 0x4400, 0x4420,
40-
0x4440, 0x4460, 0x4480, 0x44a0, 0x44c0, 0x44e0, 0x4500, 0x4520, 0x4540, 0x4560, 0x4580, 0x45a0, 0x45c0, 0x45e0, 0x4600, 0x4620,
41-
0x4640, 0x4660, 0x4680, 0x46a0, 0x46c0, 0x46e0, 0x4700, 0x4720, 0x4740, 0x4760, 0x4780, 0x47a0, 0x47c0, 0x47e0, 0x4800, 0x4820,
42-
0x4840, 0x4860, 0x4880, 0x48a0, 0x48c0, 0x48e0, 0x4900, 0x4920, 0x4940, 0x4960, 0x4980, 0x49a0, 0x49c0, 0x49e0, 0x4a00, 0x4a20,
43-
0x4a40, 0x4a60, 0x4a80, 0x4aa0, 0x4ac0, 0x4ae0, 0x4b00, 0x4b20, 0x4b40, 0x4b60, 0x4b80, 0x4ba0, 0x4bc0, 0x4be0, 0x4c00, 0x4c20,
44-
0x4c40, 0x4c60, 0x4c80, 0x4ca0, 0x4cc0, 0x4ce0, 0x4d00, 0x4d20, 0x4d40, 0x4d60, 0x4d80, 0x4dc0, 0x4de0, 0x4e00, 0x4e20, 0x4e40,
45-
0x4e60, 0x4e80, 0x4ea0, 0x4ec0, 0x4ee0, 0x4f00, 0x4f20, 0x4f40, 0x4f60, 0x4f80, 0x4fa0, 0x4fc0, 0x4fe0, 0x5000, 0x5020, 0x5040,
46-
0x5060, 0x5080, 0x50a0, 0x50c0, 0x50e0, 0x5100, 0x5120, 0x5140, 0x5160, 0x5180, 0x51a0, 0x51c0, 0x51e0, 0x5200, 0x5220, 0x5240,
47-
0x5260, 0x5280, 0x52a0, 0x52c0, 0x52e0, 0x5300, 0x5320, 0x5340, 0x5360, 0x5380, 0x53a0, 0x53c0, 0x53e0, 0x5400, 0x5420, 0x5440,
48-
0x5460, 0x5480, 0x54a0, 0x54c0, 0x54e0, 0x5500, 0x5520, 0x5540, 0x5560, 0x5580, 0x55a0, 0x55c0, 0x55e0, 0x5600, 0x5620, 0x5640,
49-
0x5660, 0x5680, 0x56a0, 0x56c0, 0x56e0, 0x5700, 0x5720, 0x5740, 0x5760, 0x5780, 0x57a0, 0x57c0, 0x57e0, 0x5800, 0x5820, 0x5840,
50-
0x5860, 0x5880, 0x58a0, 0x58c0, 0x58e0, 0x5900, 0x5920, 0x5940, 0x5960, 0x5980, 0x59a0, 0x59c0, 0x59e0, 0x5a00, 0x5a20, 0x5a40,
51-
0x5a60, 0x5a80, 0x5aa0, 0x5ac0, 0x5ae0, 0x5b00, 0x5b20, 0x5b40, 0x5b60, 0x5b80, 0x5ba0, 0x5bc0, 0x5be0, 0x5c00, 0x5c20, 0x5c40,
52-
0x5c60, 0x5c80, 0x5ca0, 0x5cc0, 0x5ce0, 0x5d00, 0x5d20, 0x5d40, 0x5d60, 0x5d80, 0x5da0, 0x5dc0, 0x5de0, 0x5e00, 0x5e20, 0x5e40,
53-
0x5e60, 0x5e80, 0x5ea0, 0x5ec0, 0x5ee0, 0x5f00, 0x5f20, 0x5f40, 0x5f60, 0x5f80, 0x5fa0, 0x5fc0, 0x5fe0, 0x6000, 0x6020, 0x6040,
54-
0x6060, 0x6080, 0x60a0, 0x60c0, 0x60e0, 0x6100, 0x6120, 0x6140, 0x6160, 0x6180, 0x61a0, 0x61c0, 0x61e0, 0x6200, 0x6220, 0x6240,
55-
0x6260, 0x6280, 0x62a0, 0x62c0, 0x62e0, 0x6300, 0x6320, 0x6340, 0x6360, 0x6380, 0x63a0, 0x63c0, 0x63e0, 0x6400, 0x6420, 0x6440,
56-
0x6460, 0x6480, 0x64a0, 0x64c0, 0x64e0, 0x6500, 0x6520, 0x6540, 0x6560, 0x6580, 0x65a0, 0x65c0, 0x65e0, 0x6600, 0x6620, 0x6640,
57-
0x6660, 0x6680, 0x66a0, 0x66c0, 0x66e0, 0x6700, 0x6720, 0x6740, 0x6760, 0x6780, 0x67a0, 0x67c0, 0x67e0, 0x6800, 0x6820, 0x6840,
58-
0x6860, 0x6880, 0x68a0, 0x68c0, 0x68e0, 0x6900, 0x6920, 0x6940, 0x6960, 0x6980, 0x69a0, 0x69c0, 0x69e0, 0x6a00, 0x6a20, 0x6a40,
59-
0x6a60, 0x6a80, 0x6aa0, 0x6ac0, 0x6ae0, 0x6b00, 0x6b20, 0x6b40, 0x6b60, 0x6b80, 0x6ba0, 0x6bc0, 0x6be0, 0x6c00, 0x6c20, 0x6c40,
60-
0x6c60, 0x6c80, 0x6ca0, 0x6cc0, 0x6ce0, 0x6d00, 0x6d20, 0x6d40, 0x6d60, 0x6d80, 0x6da0, 0x6dc0, 0x6de0, 0x6e00, 0x6e20, 0x6e40,
61-
0x6e60, 0x6e80, 0x6ea0, 0x6ec0, 0x6ee0, 0x6f00, 0x6f20, 0x6f40, 0x6f60, 0x6f80, 0x6fa0, 0x6fc0, 0x6fe0, 0x7000, 0x7020, 0x7040,
62-
0x7060, 0x7080, 0x70a0, 0x70c0, 0x70e0, 0x7100, 0x7120, 0x7140, 0x7160, 0x7180, 0x71a0, 0x71c0, 0x71e0, 0x7200, 0x7220, 0x7240,
63-
0x7260, 0x7280, 0x72a0, 0x72c0, 0x72e0, 0x7300, 0x7320, 0x7340, 0x7360, 0x7380, 0x73a0, 0x73c0, 0x73e0, 0x7400, 0x7420, 0x7440,
64-
0x7460, 0x7480, 0x74a0, 0x74c0, 0x74e0, 0x7500, 0x7520, 0x7540, 0x7560, 0x7580, 0x75a0, 0x75c0, 0x75e0, 0x7600, 0x7620, 0x7640,
65-
0x7660, 0x7680, 0x76a0, 0x76c0, 0x76e0, 0x7700, 0x7720, 0x7740, 0x7760, 0x7780, 0x77a0, 0x77c0, 0x77e0, 0x7800, 0x7820, 0x7840,
66-
0x7860, 0x7880, 0x78a0, 0x78c0, 0x78e0, 0x7900, 0x7920, 0x7940, 0x7960, 0x7980, 0x79a0, 0x79c0, 0x79e0, 0x7a00, 0x7a20, 0x7a40,
67-
0x7a60, 0x7a80, 0x7aa0, 0x7ac0, 0x7ae0, 0x7b00, 0x7b20, 0x7b40, 0x7b60, 0x7b80, 0x7ba0, 0x7bc0, 0x7be0, 0x7c00, 0x7c20, 0x7c40,
68-
0x7c60, 0x7c80, 0x7ca0, 0x7cc0, 0x7ce0, 0x7d00, 0x7d20, 0x7d40, 0x7d60, 0x7d80, 0x7da0, 0x7dc0, 0x7de0, 0x7e00, 0x7e20, 0x7e40,
69-
0x7e60, 0x7e80, 0x7ea0, 0x7ec0, 0x7ee0, 0x7f00, 0x7f20, 0x7f40, 0x7f60, 0x7f80, 0x7fa0, 0x7fc0, 0x7fe0, 0x8000, 0x8020, 0x8040,
70-
0x8060, 0x8080, 0x80a0, 0x80c0, 0x80e0, 0x8100, 0x8120, 0x8140, 0x8160, 0x8180, 0x81a0, 0x81c0, 0x81e0, 0x8200, 0x8220, 0x8240,
71-
0x8260, 0x8280, 0x82a0, 0x82c0, 0x82e0, 0x8300, 0x8320, 0x8340, 0x8360, 0x8380, 0x83a0, 0x83c0, 0x83e0, 0x8400, 0x8420, 0x8440,
72-
0x8460, 0x8480, 0x84a0, 0x84c0, 0x84e0, 0x8500, 0x8520, 0x8540, 0x8560, 0x8580, 0x85a0, 0x85c0, 0x85e0, 0x8600, 0x8620, 0x8640,
73-
0x8660, 0x8680, 0x86a0, 0x86c0, 0x86e0, 0x8700, 0x8720, 0x8740, 0x8760, 0x8780, 0x87a0, 0x87c0, 0x87e0, 0x8800, 0x8820, 0x8840,
74-
0x8860, 0x8880, 0x88a0, 0x88c0, 0x88e0, 0x8900, 0x8920, 0x8940, 0x8960, 0x8980, 0x89a0, 0x89c0, 0x89e0, 0x8a00, 0x8a20, 0x8a40,
75-
0x8a60, 0x8a80, 0x8aa0, 0x8ac0, 0x8ae0, 0x8b00, 0x8b20, 0x8b40, 0x8b60, 0x8b80, 0x8ba0, 0x8bc0, 0x8be0, 0x8c00, 0x8c20, 0x8c40,
76-
0x8c60, 0x8c80, 0x8ca0, 0x8cc0, 0x8ce0, 0x8d00, 0x8d20, 0x8d40, 0x8d60, 0x8d80, 0x8da0, 0x8dc0, 0x8de0, 0x8e00, 0x8e20, 0x8e40,
77-
0x8e60, 0x8e80, 0x8ea0, 0x8ec0, 0x8ee0, 0x8f00, 0x8f20, 0x8f40, 0x8f60, 0x8f80, 0x8fa0, 0x8fc0, 0x8fe0, 0x9000, 0x9020, 0x9040,
78-
0x9060, 0x9080, 0x90a0, 0x90c0, 0x90e0, 0x9100, 0x9120, 0x9140, 0x9160, 0x9180, 0x91a0, 0x91c0, 0x91e0, 0x9200, 0x9220, 0x9240,
79-
0x9260, 0x9280, 0x92a0, 0x92c0, 0x92e0, 0x9300, 0x9320, 0x9340, 0x9360, 0x9380, 0x93a0, 0x93c0, 0x93e0, 0x9400, 0x9420, 0x9440,
80-
0x9460, 0x9480, 0x94a0, 0x94c0, 0x94e0, 0x9500, 0x9520, 0x9540, 0x9560, 0x9580, 0x95a0, 0x95c0, 0x95e0, 0x9600, 0x9620, 0x9640,
81-
0x9660, 0x9680, 0x96a0, 0x96c0, 0x96e0, 0x9700, 0x9720, 0x9740, 0x9760, 0x9780, 0x97a0, 0x97c0, 0x97e0, 0x9800, 0x9820, 0x9840,
82-
0x9860, 0x9880, 0x98a0, 0x98c0, 0x98e0, 0x9900, 0x9920, 0x9940, 0x9960, 0x9980, 0x99a0, 0x99c0, 0x99e0, 0x9a00, 0x9a20, 0x9a40,
83-
0x9a60, 0x9a80, 0x9aa0, 0x9ac0, 0x9ae0, 0x9b00, 0x9b20, 0x9b40, 0x9b60, 0x9b80, 0x9ba0, 0x9bc0, 0x9be0, 0x9c00, 0x9c20, 0x9c40,
84-
0x9c60, 0x9c80, 0x9ca0, 0x9cc0, 0x9ce0, 0x9d00, 0x9d20, 0x9d40, 0x9d60, 0x9d80, 0x9da0, 0x9dc0, 0x9de0, 0x9e00, 0x9e20, 0x9e40,
85-
0x9e60, 0x9e80, 0x9ea0, 0x9ec0, 0x9ee0, 0x9f00, 0x9f20, 0x9f40, 0x9f60, 0x9f80, 0x9fa0, 0xa000, 0xa020, 0xa040, 0xa060, 0xa080,
86-
0xa0a0, 0xa0c0, 0xa0e0, 0xa100, 0xa120, 0xa140, 0xa160, 0xa180, 0xa1a0, 0xa1c0, 0xa1e0, 0xa200, 0xa220, 0xa240, 0xa260, 0xa280,
87-
0xa2a0, 0xa2c0, 0xa2e0, 0xa300, 0xa320, 0xa340, 0xa360, 0xa380, 0xa3a0, 0xa3c0, 0xa3e0, 0xa400, 0xa420, 0xa440, 0xa460, 0xa4a0,
88-
0xa500, 0xa520, 0xa540, 0xa560, 0xa580, 0xa5a0, 0xa5c0, 0xa5e0, 0xa640, 0xa6a0, 0xa6c0, 0xa700, 0xa720, 0xa740, 0xa780, 0xa840,
22+
// Unicode ranges for 7-bit encoding (128 total characters, 4 blocks of 32)
23+
static final int[][] CODES_7_RANGES = {
24+
{0x0180, 0x019f},
25+
{0x0240, 0x029f}
26+
};
27+
28+
// Unicode ranges for 15-bit encoding (32768 total characters, 1024 blocks of 32)
29+
static final int[][] CODES_15_RANGES = {
30+
{0x04a0, 0x04bf}, {0x0500, 0x051f}, {0x0680, 0x06bf}, {0x0760, 0x079f},
31+
{0x07c0, 0x07df}, {0x1000, 0x101f}, {0x10a0, 0x10bf}, {0x1100, 0x115f},
32+
{0x1180, 0x119f}, {0x11e0, 0x123f}, {0x1260, 0x127f}, {0x12e0, 0x12ff},
33+
{0x1320, 0x133f}, {0x13a0, 0x13df}, {0x1420, 0x165f}, {0x16a0, 0x16df},
34+
{0x1780, 0x179f}, {0x1820, 0x185f}, {0x18c0, 0x18df}, {0x1980, 0x199f},
35+
{0x19e0, 0x19ff}, {0x1a20, 0x1a3f}, {0x1bc0, 0x1bdf}, {0x1c00, 0x1c1f},
36+
{0x1d00, 0x1d1f}, {0x21e0, 0x21ff}, {0x22c0, 0x22df}, {0x2340, 0x23df},
37+
{0x2400, 0x241f}, {0x2500, 0x275f}, {0x2780, 0x27bf}, {0x2800, 0x297f},
38+
{0x29a0, 0x29bf}, {0x2a20, 0x2a5f}, {0x2a80, 0x2abf}, {0x2ae0, 0x2b5f},
39+
{0x2c00, 0x2c1f}, {0x2c80, 0x2cdf}, {0x2d00, 0x2d1f}, {0x2d40, 0x2d5f},
40+
{0x2ea0, 0x2edf}, {0x31c0, 0x31df}, {0x3400, 0x4d9f}, {0x4dc0, 0x9fbf},
41+
{0xa000, 0xa47f}, {0xa4a0, 0xa4bf}, {0xa500, 0xa5ff}, {0xa640, 0xa65f},
42+
{0xa6a0, 0xa6df}, {0xa700, 0xa75f}, {0xa780, 0xa79f}, {0xa840, 0xa85f}
8943
};
90-
// endregion CODES_15
9144

9245
private static final VarHandle VH_LONG_BE = MethodHandles.byteArrayViewVarHandle(long[].class, ByteOrder.BIG_ENDIAN);
9346

9447
private static final char[] CODES15_CHAR = new char[1 << 15];
9548
private static final char[] CODES7_CHAR = new char[1 << 7];
9649

9750
static {
98-
for (int v = 0; v < (1 << 15); v++) {
99-
CODES15_CHAR[v] = (char) (CODES_15[v >>> 5] + (v & 31));
51+
// Build CODES15_CHAR lookup table from Unicode ranges
52+
int idx = 0;
53+
for (int[] range : CODES_15_RANGES) {
54+
for (int cp = range[0]; cp <= range[1]; cp++) {
55+
CODES15_CHAR[idx++] = (char) cp;
56+
}
10057
}
101-
for (int v = 0; v < (1 << 7); v++) {
102-
CODES7_CHAR[v] = (char) (CODES_7[v >>> 5] + (v & 31));
58+
59+
// Build CODES7_CHAR lookup table from Unicode ranges
60+
idx = 0;
61+
for (int[] range : CODES_7_RANGES) {
62+
for (int cp = range[0]; cp <= range[1]; cp++) {
63+
CODES7_CHAR[idx++] = (char) cp;
64+
}
10365
}
10466
}
10567

0 commit comments

Comments
 (0)