This commit is contained in:
ed 2021-12-22 09:37:09 +01:00
parent d92ff10585
commit 0407685ecf
3 changed files with 67 additions and 57 deletions

View file

@ -673,60 +673,63 @@ export function toGsm7(text, charset, extension, CRpad) {
/**
* GSM-7 decode the input SMS as text
*
* @param {string} data
* @param {string} [alphabet="A-Za-z0-9+/="]
* @param {string} [returnType="string"] - Either "string" or "byteArray"
* @param {boolean} [removeNonAlphChars=true]
* @returns {byteArray}
* @param {ArrayBuffer} sms
* @param {array} [charset]
* @param {array} [extension]
* @param {boolean} [CRpad=true]
* @returns {string}
*/
export function fromGsm7(sms, alphabet=charsets['Default'], extension=extensions['Default'], CRpad=true) {
console.log("\n----------")
console.log(text);
//console.log(charset.join(""));
//console.log(extension.join(""));
console.log(CRpad);
console.log("------------\n")
return "";
/*
# step #1: 7bit unpacking
codepoints = []
previousbits = 0
for i,b in enumerate(sms):
mod = i % 7
c = previousbits + ((b << mod) & 0x7f)
previousbits = (b >> (7-mod))
codepoints.append(c)
if mod == 6:
c = previousbits
previousbits = 0
codepoints.append(c)
if not codepoints:
return ''
# optional step #2: remove final CR when on octet boundary
if CRpad:
if ((len(codepoints) % 8 == 0) and codepoints[-1] == 0x0d):
codepoints.pop()
# step #3: decoding with given charset and extension
text = []
esc = False
for c in codepoints:
if esc:
char = extension[c]
if char == '\x00':
char = charset[c]
elif char == '\x1b':
char = ' '
text.append(char)
esc = False
elif c == 0x1b:
esc = True
else:
text.append(charset[c])
return ''.join(text)
*/
export function fromGsm7(sms, charset, extension, CRpad) {
if (sms.length == 0) return "";
if (charset == 'Default') {
charset = CHARSET_OPTIONS[0].value;
}
if (extension == 'Default') {
extension = EXTENSION_OPTIONS[0].value;
}
// step #1: 7bit unpacking
let codePoints = [];
let previousBits = 0;
for (let i = 0; i < sms.length; i++) {
let b = sms[i];
let mod = i % 7;
let c = previousBits + ((b << mod) & 0x7f);
previousBits = b >> (7-mod);
codePoints.push(c);
if (mod==6) {
c = previousBits;
previousBits = 0;
codePoints.push(c);
}
}
// optional step #2: remove final CR when on octet boundary
if (CRpad) {
if ((codePoints.length % 8 == 0) && codePoints[-1] == 0x0d) {
codePoints.pop();
}
}
// step #3: decoding with given charset and extension
let text = [];
let esc = false;
for (let c of codePoints) {
if (esc) {
let char = extension[c];
if (char=='\x00') {
char = charset[c];
} else if (char=='\x1b') {
char = ' ';
}
text.push(char);
esc = false;
} else if (c==0x1b) {
esc = true;
} else {
text.push(charset[c]);
}
}
return text.join("");
}

View file

@ -53,7 +53,6 @@ class FromGSM7 extends Operation {
return fromGsm7(input, charset, extension, CRpad);
}
}
export default FromGSM7;

View file

@ -17,10 +17,14 @@ TestRegister.addTests([
op: "To GSM-7",
args: ["Default", "Default", false],
},
{
op: "To Hex",
args: ["Space", 0],
}
],
},
{
name: "To GSM-7: a real SMS",
name: "To GSM-7: a real SMS sent over IP",
input: "a long sms with escapes [{ ~}) should be enough to validate encoding & packing",
expectedOutput: "61 10 fb ed 3e 83 e6 ed 39 e8 9e a6 a3 41 e5 f9 38 0c 2f cf 41 1b de 06 05 da f4 36 a9 14 68 8e 7e d7 d9 64 90 b8 0c 2a bb df f5 33 1a 44 7f 83 ec 61 76 9a 1c a6 97 41 65 f7 f8 4d 4e bb cf 20 13 08 1e 1e af d3 ee 33",
recipeConfig: [
@ -52,7 +56,7 @@ TestRegister.addTests([
{
name: "To GSM-7: padding a 7 chars SMS",
input: "7Chars.",
expectedOutput: "b7 21 3a 2c 9f bb 00",
expectedOutput: "b7 21 3a 2c 9f bb 1a",
recipeConfig: [
{
op: "To GSM-7",
@ -69,9 +73,13 @@ TestRegister.addTests([
input: "",
expectedOutput: "",
recipeConfig: [
{
op: "From Hex",
args: ["Auto"],
},
{
op: "From GSM-7",
args: [],
args: ["Default", "Default", true],
},
],
},
@ -86,7 +94,7 @@ TestRegister.addTests([
},
{
op: "From GSM-7",
args: [],
args: ["Default", "Default", true],
}
],
}