@bingine/cemem 0.0.0-stage → 0.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 (138) hide show
  1. package/PORT-SCOPE.md +169 -0
  2. package/README.md +451 -2
  3. package/dist/cjs/addr/expression.js +650 -0
  4. package/dist/cjs/addr/expression.js.map +1 -0
  5. package/dist/cjs/addresslist/memory-record.js +612 -0
  6. package/dist/cjs/addresslist/memory-record.js.map +1 -0
  7. package/dist/cjs/asm/assembler.js +354 -0
  8. package/dist/cjs/asm/assembler.js.map +1 -0
  9. package/dist/cjs/asm/autoassembler-directives.js +362 -0
  10. package/dist/cjs/asm/autoassembler-directives.js.map +1 -0
  11. package/dist/cjs/asm/autoassembler.js +2163 -0
  12. package/dist/cjs/asm/autoassembler.js.map +1 -0
  13. package/dist/cjs/asm/backend.js +394 -0
  14. package/dist/cjs/asm/backend.js.map +1 -0
  15. package/dist/cjs/asm/disassembler.js +715 -0
  16. package/dist/cjs/asm/disassembler.js.map +1 -0
  17. package/dist/cjs/backend/dbk-backend.js +683 -0
  18. package/dist/cjs/backend/dbk-backend.js.map +1 -0
  19. package/dist/cjs/backend/native-ce-backend.js +667 -0
  20. package/dist/cjs/backend/native-ce-backend.js.map +1 -0
  21. package/dist/cjs/backend/self-backend.js +449 -0
  22. package/dist/cjs/backend/self-backend.js.map +1 -0
  23. package/dist/cjs/backend/types.js +48 -0
  24. package/dist/cjs/backend/types.js.map +1 -0
  25. package/dist/cjs/cheattable/ct-format.js +533 -0
  26. package/dist/cjs/cheattable/ct-format.js.map +1 -0
  27. package/dist/cjs/index.js +219 -0
  28. package/dist/cjs/index.js.map +1 -0
  29. package/dist/cjs/lua/aa.js +230 -0
  30. package/dist/cjs/lua/aa.js.map +1 -0
  31. package/dist/cjs/lua/addressing.js +118 -0
  32. package/dist/cjs/lua/addressing.js.map +1 -0
  33. package/dist/cjs/lua/api.js +736 -0
  34. package/dist/cjs/lua/api.js.map +1 -0
  35. package/dist/cjs/lua/asm.js +220 -0
  36. package/dist/cjs/lua/asm.js.map +1 -0
  37. package/dist/cjs/lua/bridge.js +526 -0
  38. package/dist/cjs/lua/bridge.js.map +1 -0
  39. package/dist/cjs/lua/marshal.js +562 -0
  40. package/dist/cjs/lua/marshal.js.map +1 -0
  41. package/dist/cjs/lua/memory.js +213 -0
  42. package/dist/cjs/lua/memory.js.map +1 -0
  43. package/dist/cjs/lua/objects.js +1070 -0
  44. package/dist/cjs/lua/objects.js.map +1 -0
  45. package/dist/cjs/lua/scan.js +543 -0
  46. package/dist/cjs/lua/scan.js.map +1 -0
  47. package/dist/cjs/lua/types.js +103 -0
  48. package/dist/cjs/lua/types.js.map +1 -0
  49. package/dist/cjs/scanner/matcher.js +781 -0
  50. package/dist/cjs/scanner/matcher.js.map +1 -0
  51. package/dist/cjs/scanner/pointer-scan.js +546 -0
  52. package/dist/cjs/scanner/pointer-scan.js.map +1 -0
  53. package/dist/cjs/scanner/scanner.js +513 -0
  54. package/dist/cjs/scanner/scanner.js.map +1 -0
  55. package/dist/cjs/scanner/shared-layout.js +207 -0
  56. package/dist/cjs/scanner/shared-layout.js.map +1 -0
  57. package/dist/cjs/types.js +190 -0
  58. package/dist/cjs/types.js.map +1 -0
  59. package/dist/cjs/value-codec.js +515 -0
  60. package/dist/cjs/value-codec.js.map +1 -0
  61. package/dist/cjs/win/process.js +475 -0
  62. package/dist/cjs/win/process.js.map +1 -0
  63. package/dist/cjs/win/scan-worker.js +84 -0
  64. package/dist/cjs/win/scan-worker.js.map +1 -0
  65. package/dist/cjs/win/winapi.js +403 -0
  66. package/dist/cjs/win/winapi.js.map +1 -0
  67. package/dist/types/addr/expression.d.ts +98 -0
  68. package/dist/types/addr/expression.d.ts.map +1 -0
  69. package/dist/types/addresslist/memory-record.d.ts +218 -0
  70. package/dist/types/addresslist/memory-record.d.ts.map +1 -0
  71. package/dist/types/asm/assembler.d.ts +106 -0
  72. package/dist/types/asm/assembler.d.ts.map +1 -0
  73. package/dist/types/asm/autoassembler-directives.d.ts +118 -0
  74. package/dist/types/asm/autoassembler-directives.d.ts.map +1 -0
  75. package/dist/types/asm/autoassembler.d.ts +434 -0
  76. package/dist/types/asm/autoassembler.d.ts.map +1 -0
  77. package/dist/types/asm/backend.d.ts +167 -0
  78. package/dist/types/asm/backend.d.ts.map +1 -0
  79. package/dist/types/asm/disassembler.d.ts +194 -0
  80. package/dist/types/asm/disassembler.d.ts.map +1 -0
  81. package/dist/types/backend/dbk-backend.d.ts +353 -0
  82. package/dist/types/backend/dbk-backend.d.ts.map +1 -0
  83. package/dist/types/backend/native-ce-backend.d.ts +213 -0
  84. package/dist/types/backend/native-ce-backend.d.ts.map +1 -0
  85. package/dist/types/backend/self-backend.d.ts +64 -0
  86. package/dist/types/backend/self-backend.d.ts.map +1 -0
  87. package/dist/types/backend/types.d.ts +176 -0
  88. package/dist/types/backend/types.d.ts.map +1 -0
  89. package/dist/types/cheattable/ct-format.d.ts +100 -0
  90. package/dist/types/cheattable/ct-format.d.ts.map +1 -0
  91. package/dist/types/index.d.ts +54 -0
  92. package/dist/types/index.d.ts.map +1 -0
  93. package/dist/types/lua/aa.d.ts +107 -0
  94. package/dist/types/lua/aa.d.ts.map +1 -0
  95. package/dist/types/lua/addressing.d.ts +41 -0
  96. package/dist/types/lua/addressing.d.ts.map +1 -0
  97. package/dist/types/lua/api.d.ts +46 -0
  98. package/dist/types/lua/api.d.ts.map +1 -0
  99. package/dist/types/lua/asm.d.ts +42 -0
  100. package/dist/types/lua/asm.d.ts.map +1 -0
  101. package/dist/types/lua/bridge.d.ts +129 -0
  102. package/dist/types/lua/bridge.d.ts.map +1 -0
  103. package/dist/types/lua/marshal.d.ts +244 -0
  104. package/dist/types/lua/marshal.d.ts.map +1 -0
  105. package/dist/types/lua/memory.d.ts +61 -0
  106. package/dist/types/lua/memory.d.ts.map +1 -0
  107. package/dist/types/lua/objects.d.ts +210 -0
  108. package/dist/types/lua/objects.d.ts.map +1 -0
  109. package/dist/types/lua/scan.d.ts +106 -0
  110. package/dist/types/lua/scan.d.ts.map +1 -0
  111. package/dist/types/lua/types.d.ts +146 -0
  112. package/dist/types/lua/types.d.ts.map +1 -0
  113. package/dist/types/scanner/matcher.d.ts +122 -0
  114. package/dist/types/scanner/matcher.d.ts.map +1 -0
  115. package/dist/types/scanner/pointer-scan.d.ts +187 -0
  116. package/dist/types/scanner/pointer-scan.d.ts.map +1 -0
  117. package/dist/types/scanner/scanner.d.ts +150 -0
  118. package/dist/types/scanner/scanner.d.ts.map +1 -0
  119. package/dist/types/scanner/shared-layout.d.ts +96 -0
  120. package/dist/types/scanner/shared-layout.d.ts.map +1 -0
  121. package/dist/types/types.d.ts +239 -0
  122. package/dist/types/types.d.ts.map +1 -0
  123. package/dist/types/value-codec.d.ts +134 -0
  124. package/dist/types/value-codec.d.ts.map +1 -0
  125. package/dist/types/win/process.d.ts +190 -0
  126. package/dist/types/win/process.d.ts.map +1 -0
  127. package/dist/types/win/scan-worker.d.ts +51 -0
  128. package/dist/types/win/scan-worker.d.ts.map +1 -0
  129. package/dist/types/win/winapi.d.ts +144 -0
  130. package/dist/types/win/winapi.d.ts.map +1 -0
  131. package/docs/assembler.md +371 -0
  132. package/docs/autoassembler.md +423 -0
  133. package/docs/backend-dbk.md +305 -0
  134. package/docs/backends.md +273 -0
  135. package/docs/evidence/atomics-wait-io.js +20 -0
  136. package/docs/evidence/mini-repro.js +98 -0
  137. package/docs/lua-api.md +718 -0
  138. package/package.json +60 -4
@@ -0,0 +1,515 @@
1
+ "use strict";
2
+ /**
3
+ * 数值编解码层 —— 与 Cheat Engine `memscan.pas` 的变量类型语义严格对齐。
4
+ *
5
+ * 本模块负责三件事:
6
+ * 1. 从 Buffer 中按 CE 的变量类型读写数值(含大小端、精度、有符号/无符号);
7
+ * 2. 复刻 CE 的扫描值解析(十六进制前缀、区间、百分比、小数位数 floataccuracy);
8
+ * 3. 复刻 CE 的浮点比较策略(rtRounded / rtExtremerounded / rtTruncated)。
9
+ *
10
+ * 对齐依据:`memscan.pas` 的 SingleExact/DoubleExact/SingleBetween 等
11
+ * 以及 setScanValueFloat 片段(floataccuracy 计算、RoundTo 调用、min/max 边界)。
12
+ */
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.readUInt8 = readUInt8;
15
+ exports.readInt8 = readInt8;
16
+ exports.readUInt16 = readUInt16;
17
+ exports.readInt16 = readInt16;
18
+ exports.readUInt32 = readUInt32;
19
+ exports.readInt32 = readInt32;
20
+ exports.readUInt64 = readUInt64;
21
+ exports.readInt64 = readInt64;
22
+ exports.readSingle = readSingle;
23
+ exports.readDouble = readDouble;
24
+ exports.writeUInt8 = writeUInt8;
25
+ exports.writeUInt16 = writeUInt16;
26
+ exports.writeUInt32 = writeUInt32;
27
+ exports.writeUInt64 = writeUInt64;
28
+ exports.writeSingle = writeSingle;
29
+ exports.writeDouble = writeDouble;
30
+ exports.writeValue = writeValue;
31
+ exports.roundTo = roundTo;
32
+ exports.parseIntegerLiteral = parseIntegerLiteral;
33
+ exports.parseFloatLiteral = parseFloatLiteral;
34
+ exports.decimalsOf = decimalsOf;
35
+ exports.buildFloatCompareParams = buildFloatCompareParams;
36
+ exports.singleMatches = singleMatches;
37
+ exports.doubleMatches = doubleMatches;
38
+ exports.parseAob = parseAob;
39
+ exports.aobHasNibbleWildcard = aobHasNibbleWildcard;
40
+ exports.aobMatchesAt = aobMatchesAt;
41
+ exports.parseBinaryPattern = parseBinaryPattern;
42
+ exports.binaryByteWidth = binaryByteWidth;
43
+ exports.testString = testString;
44
+ exports.testWideString = testWideString;
45
+ exports.testStringCI = testStringCI;
46
+ exports.testWideStringCI = testWideStringCI;
47
+ exports.upCaseWide = upCaseWide;
48
+ const types_1 = require("./types");
49
+ /* ------------------------------------------------------------------ *
50
+ * 基础读取
51
+ * ------------------------------------------------------------------ */
52
+ function readUInt8(buf, off) {
53
+ return buf[off];
54
+ }
55
+ function readInt8(buf, off) {
56
+ const v = buf[off];
57
+ return v < 0x80 ? v : v - 0x100;
58
+ }
59
+ function readUInt16(buf, off) {
60
+ return buf.readUInt16LE(off);
61
+ }
62
+ function readInt16(buf, off) {
63
+ return buf.readInt16LE(off);
64
+ }
65
+ function readUInt32(buf, off) {
66
+ return buf.readUInt32LE(off);
67
+ }
68
+ function readInt32(buf, off) {
69
+ return buf.readInt32LE(off);
70
+ }
71
+ function readUInt64(buf, off) {
72
+ return buf.readBigUInt64LE(off);
73
+ }
74
+ function readInt64(buf, off) {
75
+ return buf.readBigInt64LE(off);
76
+ }
77
+ function readSingle(buf, off) {
78
+ return buf.readFloatLE(off);
79
+ }
80
+ function readDouble(buf, off) {
81
+ return buf.readDoubleLE(off);
82
+ }
83
+ /* ------------------------------------------------------------------ *
84
+ * 基础写入(溢出按 CE 一样自然回绕)
85
+ * ------------------------------------------------------------------ */
86
+ function writeUInt8(buf, off, v) {
87
+ buf[off] = Number(BigInt.asUintN(8, BigInt(v)));
88
+ }
89
+ function writeUInt16(buf, off, v) {
90
+ buf.writeUInt16LE(Number(BigInt.asUintN(16, BigInt(v))), off);
91
+ }
92
+ function writeUInt32(buf, off, v) {
93
+ buf.writeUInt32LE(Number(BigInt.asUintN(32, BigInt(v))), off);
94
+ }
95
+ function writeUInt64(buf, off, v) {
96
+ buf.writeBigUInt64LE(BigInt.asUintN(64, BigInt(v)), off);
97
+ }
98
+ function writeSingle(buf, off, v) {
99
+ buf.writeFloatLE(v, off);
100
+ }
101
+ function writeDouble(buf, off, v) {
102
+ buf.writeDoubleLE(v, off);
103
+ }
104
+ /** 按变量类型把值写入 buffer(写入路径的统一起点)。 */
105
+ function writeValue(buf, off, type, value) {
106
+ switch (type) {
107
+ case types_1.VariableType.Byte:
108
+ writeUInt8(buf, off, value);
109
+ return;
110
+ case types_1.VariableType.Word:
111
+ writeUInt16(buf, off, value);
112
+ return;
113
+ case types_1.VariableType.DWord:
114
+ case types_1.VariableType.Pointer:
115
+ writeUInt32(buf, off, value);
116
+ return;
117
+ case types_1.VariableType.QWord:
118
+ writeUInt64(buf, off, value);
119
+ return;
120
+ case types_1.VariableType.Single:
121
+ writeSingle(buf, off, Number(value));
122
+ return;
123
+ case types_1.VariableType.Double:
124
+ writeDouble(buf, off, Number(value));
125
+ return;
126
+ case types_1.VariableType.String:
127
+ case types_1.VariableType.CodePageString: {
128
+ const s = Buffer.from(String(value), 'latin1');
129
+ s.copy(buf, off);
130
+ return;
131
+ }
132
+ case types_1.VariableType.UnicodeString: {
133
+ const s = Buffer.from(String(value), 'utf16le');
134
+ s.copy(buf, off);
135
+ return;
136
+ }
137
+ default:
138
+ throw new Error(`writeValue 不支持的变量类型: ${types_1.VariableType[type]}`);
139
+ }
140
+ }
141
+ /* ------------------------------------------------------------------ *
142
+ * RoundTo —— 复刻 Delphi/FPC 的 RoundTo(Value, -Digits)
143
+ *
144
+ * 命名约定:CE 调用的是 RoundTo(x, -floataccuracy),其中 floataccuracy 是
145
+ * "保留的小数位数"。本函数直接接收**小数位数**,即 roundTo(x, 1) 等价于
146
+ * FPC 的 RoundTo(x, -1)(保留 1 位小数)。请勿再对入参取负。
147
+ *
148
+ * FPC 的 RoundTo 对半值做"取偶"舍入(banker's rounding):
149
+ * 0.5 → 0,1.5 → 2,2.5 → 2,3.5 → 4。
150
+ * CE 在浮点精确比较里大量依赖这一行为,因此必须复刻。
151
+ * ------------------------------------------------------------------ */
152
+ /**
153
+ * 小数位 → 缩放因子缓存。
154
+ *
155
+ * 扫描时 roundTo 会被每个字节调用一次(1GB 内存就是数亿次),
156
+ * 因此不能每次调 Math.pow / toPrecision。这里只缓存因子,
157
+ * 舍入本身用纯算术实现,保证热路径足够快。
158
+ */
159
+ const FACTOR_CACHE = new Map();
160
+ function factorFor(decimals) {
161
+ const cached = FACTOR_CACHE.get(decimals);
162
+ if (cached !== undefined)
163
+ return cached;
164
+ const f = Math.pow(10, decimals);
165
+ FACTOR_CACHE.set(decimals, f);
166
+ return f;
167
+ }
168
+ function roundTo(value, decimals) {
169
+ if (!Number.isFinite(value))
170
+ return value;
171
+ const factor = factorFor(decimals);
172
+ if (!Number.isFinite(factor) || factor === 0)
173
+ return value;
174
+ const scaled = value * factor;
175
+ if (!Number.isFinite(scaled))
176
+ return value;
177
+ // 半值取偶(FPC RoundTo 语义):仅当恰好落在 .5 上才做奇偶判断
178
+ const floor = Math.floor(scaled);
179
+ const diff = scaled - floor;
180
+ let rounded;
181
+ if (diff > 0.5)
182
+ rounded = floor + 1;
183
+ else if (diff < 0.5)
184
+ rounded = floor;
185
+ else
186
+ rounded = floor % 2 === 0 ? floor : floor + 1;
187
+ return rounded / factor;
188
+ }
189
+ /**
190
+ * 解析 CE 风格的整数字面量。
191
+ * 支持:十进制、`$`/`0x` 前缀十六进制、可选的 `+`/`-` 前缀。
192
+ * 无效时抛错,便于 CLI 给出明确提示。
193
+ */
194
+ function parseIntegerLiteral(input, forceHex = false) {
195
+ let s = input.trim().replace(/[\s_]/g, '');
196
+ if (s === '')
197
+ throw new Error('空数值');
198
+ let negative = false;
199
+ if (s.startsWith('+'))
200
+ s = s.slice(1);
201
+ else if (s.startsWith('-')) {
202
+ negative = true;
203
+ s = s.slice(1);
204
+ }
205
+ let hex = forceHex;
206
+ if (s.startsWith('$')) {
207
+ hex = true;
208
+ s = s.slice(1);
209
+ }
210
+ else if (/^0x/i.test(s)) {
211
+ hex = true;
212
+ s = s.slice(2);
213
+ }
214
+ let raw;
215
+ if (hex) {
216
+ if (!/^[0-9a-f]+$/i.test(s))
217
+ throw new Error(`无效的十六进制数值: "${input}"`);
218
+ raw = BigInt('0x' + s);
219
+ }
220
+ else {
221
+ if (!/^[0-9]+$/.test(s))
222
+ throw new Error(`无效的整数值: "${input}"`);
223
+ raw = BigInt(s);
224
+ }
225
+ if (negative)
226
+ raw = BigInt.asUintN(64, -raw);
227
+ return { raw, negative, hex };
228
+ }
229
+ /** 解析浮点字面量(支持科学计数法)。 */
230
+ function parseFloatLiteral(input) {
231
+ const v = Number(input.trim());
232
+ if (Number.isNaN(v))
233
+ throw new Error(`无效的浮点数值: "${input}"`);
234
+ return v;
235
+ }
236
+ /** 统计字符串中的小数位数,对齐 CE 的 floataccuracy 推导。 */
237
+ function decimalsOf(input) {
238
+ if (/[eE]/.test(input))
239
+ return 0; // CE: 含指数时 floataccuracy=0
240
+ const m = input.match(/[.,](\d+)\s*$/);
241
+ return m ? m[1].length : 0;
242
+ }
243
+ /**
244
+ * 由用户输入推导浮点比较参数。
245
+ *
246
+ * 对齐 CE `setScanValueFloat`:
247
+ * - floataccuracy = 去掉小数点后的位数(含 E 时置 0)
248
+ * - 非百分比且 accuracy != 0 时,对 svalue/svalue2/dvalue/dvalue2 做 RoundTo(., -accuracy)
249
+ * - accuracy != 0: min/max = value ∓ 1/10^accuracy
250
+ * 否则: min/max = value ∓ 1
251
+ * - truncated 模式 CE 使用 maxsvalue/maxdvalue 作为上界
252
+ */
253
+ function buildFloatCompareParams(value1, value2, isPercentage) {
254
+ let dvalue = parseFloatLiteral(value1);
255
+ let dvalue2 = value2 !== undefined && value2.trim() !== '' ? parseFloatLiteral(value2) : dvalue;
256
+ if (isPercentage) {
257
+ if (dvalue > dvalue2) {
258
+ const t = dvalue;
259
+ dvalue = dvalue2;
260
+ dvalue2 = t;
261
+ }
262
+ dvalue = dvalue / 100;
263
+ dvalue2 = dvalue2 / 100;
264
+ }
265
+ let svalue = dvalue;
266
+ let svalue2 = dvalue2;
267
+ const accuracy = decimalsOf(value1);
268
+ if (accuracy !== 0 && !isPercentage) {
269
+ svalue = roundTo(svalue, accuracy);
270
+ svalue2 = roundTo(svalue2, accuracy);
271
+ dvalue = roundTo(dvalue, accuracy);
272
+ dvalue2 = roundTo(dvalue2, accuracy);
273
+ }
274
+ let minSingle, maxSingle, minDouble, maxDouble;
275
+ if (accuracy !== 0) {
276
+ const eps = 1 / Math.pow(10, accuracy);
277
+ minDouble = dvalue - eps;
278
+ maxDouble = dvalue + eps;
279
+ minSingle = svalue - eps;
280
+ maxSingle = svalue + eps;
281
+ }
282
+ else {
283
+ minDouble = dvalue - 1;
284
+ maxDouble = dvalue + 1;
285
+ minSingle = svalue - 1;
286
+ maxSingle = svalue + 1;
287
+ }
288
+ return {
289
+ value: dvalue,
290
+ single: svalue,
291
+ accuracy,
292
+ value2: dvalue2,
293
+ single2: svalue2,
294
+ minSingle,
295
+ maxSingle,
296
+ minDouble,
297
+ maxDouble,
298
+ maxTruncSingle: maxSingle,
299
+ maxTruncDouble: maxDouble,
300
+ isPercentage,
301
+ };
302
+ }
303
+ /* ------------------------------------------------------------------ *
304
+ * 按舍入策略的比较原语
305
+ * ------------------------------------------------------------------ */
306
+ /** 对齐 TScanner.SingleExact(注意 rtExtremerounded 用闭区间 ≥/≤)。 */
307
+ function singleMatches(actual, p, rounding) {
308
+ switch (rounding) {
309
+ case types_1.RoundingType.Rounded:
310
+ return roundTo(actual, p.accuracy) === p.single;
311
+ case types_1.RoundingType.ExtremeRounded:
312
+ return actual >= p.minSingle && actual <= p.maxSingle;
313
+ case types_1.RoundingType.Truncated:
314
+ return actual >= p.single && actual < p.maxTruncSingle;
315
+ default:
316
+ return false;
317
+ }
318
+ }
319
+ /** 对齐 TScanner.DoubleExact(注意 rtExtremerounded 用开区间 >/<)。 */
320
+ function doubleMatches(actual, p, rounding) {
321
+ switch (rounding) {
322
+ case types_1.RoundingType.Rounded:
323
+ return roundTo(actual, p.accuracy) === p.value;
324
+ case types_1.RoundingType.ExtremeRounded:
325
+ return actual > p.minDouble && actual < p.maxDouble;
326
+ case types_1.RoundingType.Truncated:
327
+ return actual >= p.value && actual < p.maxTruncDouble;
328
+ default:
329
+ return false;
330
+ }
331
+ }
332
+ /**
333
+ * 解析 AOB 字符串,对齐 `parsers.ConvertStringToBytes` + 半字节通配支持。
334
+ *
335
+ * 支持:
336
+ * - `90 90 ??`、`90,90,xx`、`9090??`(- 、 , 、空格均为分隔符,且允许两字符一组连写)
337
+ * - 半字节通配 `7*`、`*7`,对齐 CE 的 $8000f070 / $80000f07 编码语义
338
+ */
339
+ function parseAob(input, hexadecimal = true) {
340
+ const out = [];
341
+ const trimmed = input.trim();
342
+ if (trimmed === '')
343
+ return out;
344
+ // 对齐 CE: delims = [' ', ',', '-']
345
+ const words = trimmed.split(/[\s,\-]+/).filter((w) => w !== '');
346
+ for (const word of words) {
347
+ if (!hexadecimal) {
348
+ const n = Number(word);
349
+ if (Number.isInteger(n) && n >= 0 && n <= 255) {
350
+ out.push({ wildcard: false, value: n, mask: 0xff });
351
+ }
352
+ else {
353
+ out.push({ wildcard: true, value: 0, mask: 0x00 });
354
+ }
355
+ continue;
356
+ }
357
+ // 十六进制:每两个字符一个字节
358
+ let j = 0;
359
+ while (j < word.length) {
360
+ const pair = word.slice(j, j + 2);
361
+ j += 2;
362
+ if (/^[0-9a-f]{2}$/i.test(pair)) {
363
+ out.push({ wildcard: false, value: parseInt(pair, 16), mask: 0xff });
364
+ continue;
365
+ }
366
+ // 完全通配
367
+ if (/^[?*x]{1,2}$/i.test(pair)) {
368
+ out.push({ wildcard: true, value: 0, mask: 0x00 });
369
+ continue;
370
+ }
371
+ // 半字节通配(仅当为完整两字符时,对齐 CE canHandleNibbleWildcards)
372
+ if (pair.length === 2) {
373
+ const hi = pair[0];
374
+ const lo = pair[1];
375
+ if (/[0-9a-f]/i.test(hi) && /[?*x]/i.test(lo)) {
376
+ // 形如 7* → 高半字节必须匹配
377
+ out.push({ wildcard: false, value: parseInt(hi, 16) << 4, mask: 0xf0 });
378
+ continue;
379
+ }
380
+ if (/[?*x]/i.test(hi) && /[0-9a-f]/i.test(lo)) {
381
+ // 形如 *7 → 低半字节必须匹配
382
+ out.push({ wildcard: false, value: parseInt(lo, 16), mask: 0x0f });
383
+ continue;
384
+ }
385
+ }
386
+ out.push({ wildcard: true, value: 0, mask: 0x00 });
387
+ }
388
+ }
389
+ return out;
390
+ }
391
+ /** 判断 AOB 模式中是否含有半字节级通配(决定是否走慢路径)。 */
392
+ function aobHasNibbleWildcard(pattern) {
393
+ return pattern.some((b) => !b.wildcard && b.mask !== 0xff);
394
+ }
395
+ /** 在缓冲区指定偏移处比较 AOB 模式。 */
396
+ function aobMatchesAt(buf, off, pattern, nibbleSupport) {
397
+ const n = pattern.length;
398
+ if (off + n > buf.length)
399
+ return false;
400
+ if (!nibbleSupport) {
401
+ for (let i = 0; i < n; i++) {
402
+ const p = pattern[i];
403
+ if (p.wildcard)
404
+ continue;
405
+ if (buf[off + i] !== p.value)
406
+ return false;
407
+ }
408
+ return true;
409
+ }
410
+ for (let i = 0; i < n; i++) {
411
+ const p = pattern[i];
412
+ if (p.wildcard)
413
+ continue;
414
+ if ((buf[off + i] & p.mask) !== (p.value & p.mask))
415
+ return false;
416
+ }
417
+ return true;
418
+ }
419
+ /**
420
+ * 由位串推导 andmask/bitmask,对齐 CE setScanValue 中 vtBinary 分支:
421
+ * '?' 或 '*' → andmask 位 0,bitmask 位 0
422
+ * '0' / '1' → andmask 位 1,bitmask 位取该数字
423
+ */
424
+ function parseBinaryPattern(input) {
425
+ let andStr = '';
426
+ let bitStr = '';
427
+ for (const ch of input) {
428
+ if (ch === '?' || ch === '*') {
429
+ andStr += '0';
430
+ bitStr += '0';
431
+ }
432
+ else if (ch === '0' || ch === '1') {
433
+ andStr += '1';
434
+ bitStr += ch;
435
+ }
436
+ else if (ch === ' ' || ch === '\b') {
437
+ continue;
438
+ }
439
+ else {
440
+ throw new Error(`无效的二进制记法: "${ch}"`);
441
+ }
442
+ }
443
+ if (andStr.length === 0)
444
+ throw new Error('二进制串为空');
445
+ return {
446
+ andMask: BigInt('0b' + andStr),
447
+ bitMask: BigInt('0b' + bitStr),
448
+ bitCount: andStr.length,
449
+ };
450
+ }
451
+ /** 位串在内存中的字节宽度(向上取整)。 */
452
+ function binaryByteWidth(bitCount) {
453
+ return Math.ceil(bitCount / 8);
454
+ }
455
+ /* ------------------------------------------------------------------ *
456
+ * 字符串扫描
457
+ * ------------------------------------------------------------------ */
458
+ /** 对齐 testString:区分大小写 */
459
+ function testString(buf, off, target) {
460
+ if (off + target.length > buf.length)
461
+ return false;
462
+ for (let i = 0; i < target.length; i++) {
463
+ if (buf[off + i] !== (target.charCodeAt(i) & 0xff))
464
+ return false;
465
+ }
466
+ return true;
467
+ }
468
+ /** 对齐 testWideString:UTF-16LE 区分大小写 */
469
+ function testWideString(buf, off, target) {
470
+ const need = target.length * 2;
471
+ if (off + need > buf.length)
472
+ return false;
473
+ for (let i = 0; i < target.length; i++) {
474
+ if (buf.readUInt16LE(off + i * 2) !== target.charCodeAt(i))
475
+ return false;
476
+ }
477
+ return true;
478
+ }
479
+ /** 对齐 CaseInsensitiveAnsiStringExact:仅 ASCII a-z 折叠为大写。 */
480
+ function testStringCI(buf, off, upperTarget) {
481
+ if (off + upperTarget.length > buf.length)
482
+ return false;
483
+ for (let i = 0; i < upperTarget.length; i++) {
484
+ let c = buf[off + i];
485
+ if (c >= 0x61 && c <= 0x7a)
486
+ c -= 0x20;
487
+ if (c !== upperTarget.charCodeAt(i))
488
+ return false;
489
+ }
490
+ return true;
491
+ }
492
+ /** 对齐 CaseInsensitiveUnicodeStringExact:用 UpCase 逐字符比较。 */
493
+ function testWideStringCI(buf, off, target) {
494
+ const need = target.length * 2;
495
+ if (off + need > buf.length)
496
+ return false;
497
+ for (let i = 0; i < target.length; i++) {
498
+ const c = buf.readUInt16LE(off + i * 2);
499
+ if (upCaseWide(c) !== upCaseWide(target.charCodeAt(i)))
500
+ return false;
501
+ }
502
+ return true;
503
+ }
504
+ /**
505
+ * 对齐 FPC 的 system.UpCase(宽字符版):
506
+ * 只处理 Latin-1 的 a-z / à-þ 等基本区段,这里复刻 ASCII + Latin-1 行为。
507
+ */
508
+ function upCaseWide(c) {
509
+ if (c >= 0x61 && c <= 0x7a)
510
+ return c - 0x20;
511
+ if (c >= 0xe0 && c <= 0xfe && c !== 0xf7)
512
+ return c - 0x20;
513
+ return c;
514
+ }
515
+ //# sourceMappingURL=value-codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"value-codec.js","sourceRoot":"","sources":["../../src/value-codec.ts"],"names":[],"mappings":"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"}