diff --git a/src/core/config/Categories.json b/src/core/config/Categories.json
index aac00ca1..4b58d340 100644
--- a/src/core/config/Categories.json
+++ b/src/core/config/Categories.json
@@ -41,6 +41,7 @@
"From Base",
"To BCD",
"From BCD",
+ "Text-Integer Conversion",
"To HTML Entity",
"From HTML Entity",
"URL Encode",
diff --git a/src/core/operations/TextIntegerConverter.mjs b/src/core/operations/TextIntegerConverter.mjs
new file mode 100644
index 00000000..e7ff4547
--- /dev/null
+++ b/src/core/operations/TextIntegerConverter.mjs
@@ -0,0 +1,114 @@
+/**
+ * @author p-leriche [philip.leriche@cantab.net]
+ * @copyright Crown Copyright 2025
+ * @license Apache-2.0
+ */
+
+import Operation from "../Operation.mjs";
+
+/* ---------- helper functions ---------- */
+
+/**
+ * Convert text to BigInt (big-endian byte interpretation)
+ */
+function textToBigInt(text) {
+ if (text.length === 0) return 0n;
+
+ let result = 0n;
+ for (let i = 0; i < text.length; i++) {
+ const charCode = BigInt(text.charCodeAt(i));
+ result = (result << 8n) | charCode;
+ }
+ return result;
+}
+
+/**
+ * Convert BigInt to text (big-endian byte interpretation)
+ */
+function bigIntToText(value) {
+ if (value === 0n) return "";
+
+ const bytes = [];
+ let num = value;
+
+ while (num > 0n) {
+ bytes.unshift(Number(num & 0xFFn));
+ num >>= 8n;
+ }
+
+ return String.fromCharCode(...bytes);
+}
+
+/* ---------- operation class ---------- */
+
+/**
+ * Text/Integer Converter operation
+ */
+class TextIntegerConverter extends Operation {
+ /**
+ * TextIntegerConverter constructor
+ */
+ constructor() {
+ super();
+
+ this.description =
+ "Converts between text strings and large integers (decimal or hexadecimal).
" +
+ "Text is interpreted as a big-endian sequence of character codes. For example:
" +
+ "ABC is 0x414243 (hex) is 4276803 (decimal)
" +
+ "Input format detection:
" +
+ "Decimal: digits 0-9 only
" +
+ "Hexadecimal: 0x... prefix
" +
+ "Quoted or unquoted text: treated as string
" ;
+ this.infoURL = "https://wikipedia.org/wiki/Endianness";
+ this.inputType = "string";
+ this.outputType = "string";
+ this.args = [
+ {
+ name: "Output format",
+ type: "option",
+ value: ["String", "Decimal", "Hexadecimal"]
+ }
+ ];
+ this.name = "Text-Integer Conversion";
+ this.module = "Default";
+ }
+
+ /**
+ * @param {string} input
+ * @param {Object[]} args
+ * @returns {string}
+ */
+ run(input, args) {
+ const outputFormat = args[0];
+ const trimmed = input.trim();
+
+ let bigIntValue;
+
+ if (!trimmed) {
+ // Null input - treat as zero
+ bigIntValue = 0;
+ } else if (/^0x[0-9a-f]+$/i.test(trimmed) ||
+ /^[+-]?[0-9]+$/.test(trimmed)) {
+ // Hex or decimal integer
+ bigIntValue = BigInt(trimmed);
+ } else if (/^["'].*["']$/.test(trimmed)) {
+ // Quoted string: Remove quotes and convert text to BigInt
+ const text = trimmed.slice(1, -1);
+ bigIntValue = textToBigInt(text);
+ } else {
+ // Assume it's unquoted text
+ bigIntValue = textToBigInt(trimmed);
+ }
+
+ // Convert to output format
+ if (outputFormat === "String") {
+ return bigIntToText(bigIntValue);
+ } else if (outputFormat === "Decimal") {
+ return bigIntValue.toString();
+ } else { // Hexadecimal
+ return "0x" + bigIntValue.toString(16);
+ }
+ }
+}
+
+export default TextIntegerConverter;