diff --git a/backend/assets/functions/functionObject.js b/backend/assets/functions/functionObject.js index a785f5d..b4a2aa4 100644 --- a/backend/assets/functions/functionObject.js +++ b/backend/assets/functions/functionObject.js @@ -7,6 +7,7 @@ const { weatherRequestOutput } = require('./ma const { convertCurrencyOutput } = require('./main/convertCurrency'); const { calculateAgeOutput } = require('./main/calculateAge'); const { heapAlgorithmOutput } = require('./main/heapAlgorithm'); +const { convertEncodingOutput } = require('./main/convertEncoding'); const functionObject = { randomNumber : randomNumberOutput, @@ -18,7 +19,8 @@ const functionObject = { weatherRequest : weatherRequestOutput, convertCurrency : convertCurrencyOutput, calculateAge : calculateAgeOutput, - heapAlgorithm : heapAlgorithmOutput + heapAlgorithm : heapAlgorithmOutput, + convertEncoding : convertEncodingOutput }; // Choisi la fonction à exécuter diff --git a/backend/assets/functions/main/convertEncoding.js b/backend/assets/functions/main/convertEncoding.js new file mode 100644 index 0000000..b60236d --- /dev/null +++ b/backend/assets/functions/main/convertEncoding.js @@ -0,0 +1,243 @@ +const errorHandling = require('../../utils/errorHandling'); +const { requiredFields, generalError } = require('../../config/errors'); + +/** + * @description Convertis un nombre décimal en binaire. + * @param {String} value - Le nombre à convertir en string + * @returns {String} - Le nombre en binaire + * @examples decimalToBinary('2') → '10' + */ +function decimalToBinary(value) { + value = Number(value); + if (isNaN(value)) { + return false; + } else { + return value.toString(2); + } +} + +/** + * @description Convertis un nombre binaire en décimal. + * @param {String} value - Le nombre à convertir + * @returns {(Number|String)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000' + * @examples binaryToDecimal('10') → 2 + */ +function binaryToDecimal(value) { + const result = parseInt(Number(value), 2); + if (isNaN(result)) { + return false; + } else { + return result; + } +} + +/** + * @description Convertis un nombre décimal en hexadécimal. + * @param {String} value - Le nombre à convertir + * @returns {String} - Le nombre en hexadécimal + * @examples decimalToHexadecimal('15') → 'F' + */ +function decimalToHexadecimal(value) { + value = Number(value); + if (isNaN(value)) { + return false; + } else { + return value.toString(16).toUpperCase(); + } +} + +/** + * @description Convertis un nombre hexadécimal en décimal. + * @param {String} value - Le nombre à convertir + * @returns {(Number|String)} - Le nombre en décimal soit en nombre ou soit en string si supérieur à 1000 car pour 1000 par exemple formatNumberResult renvoie '1 000' + * @examples hexadecimalToDecimal('F') → 15 + */ +function hexadecimalToDecimal(value) { + const result = parseInt(value, 16); + if (isNaN(result)) { + return false; + } else { + return result; + } +} + +/** + * @description Convertis un nombre binaire en hexadécimal. + * @param {String} value - Le nombre à convertir + * @returns {String} - Le nombre en hexadécimal + * @examples binaryToHexadecimal('1111') → 'F' + */ +function binaryToHexadecimal(value) { + value = Number(value); + value = parseInt(value, 2); + if (isNaN(value)) { + return false; + } else { + return parseInt(value).toString(16).toUpperCase(); + } +} + +/** + * @description Convertis un nombre hexadécimal en binaire. + * @param {String} value - Le nombre à convertir + * @returns {String} - Le nombre en binaire + * @examples hexadecimalToBinary('F') → '1111' + */ +function hexadecimalToBinary(value) { + value = parseInt(value, 16); + if (isNaN(value)) { + return false; + } else { + return parseInt(value).toString(2); + } +} + +// Convertis des nombres de différentes bases et convertis en UTF-8. (source : http://jsfiddle.net/47zwb41o) + +/** + * @description Convertis chaque caractère d'une string en codePoint Unicode. + * @param {String} value - La chaîne de caractère à convertir + * @returns {String} + * @examples textToNumberUnicode('abc') → '97 98 99' + */ +function textToNumberUnicode(string) { + try { + let resultat = ""; + for (let index in string) { + resultat = resultat + string.codePointAt(index) + " "; + } + return resultat; + } + catch(error) { + return false; + } +} + +/** + * @description Convertis chaque codePoint Unicode en caractère. + * @param {String} string - Nombre Unicode à convertir espacé par un espace à chaque fois + * @returns {String} + * @examples numberUnicodeToText('97 98 99') → 'abc' + */ +function numberUnicodeToText(string) { + try { + const array = string.split(" "); + let resultat = ""; + for (let index in array) { + resultat = resultat + String.fromCodePoint(parseInt(array[index]).toString()); + } + return resultat; + } + catch(error) { + return false; + } +} + +/** + * @description Convertis un Texte en Binaire (UTF-8). + * @param {String} s - La chaîne de caractère à convertir + * @returns {String} + * @examples textToBinary('abc') → '01100001 01100010 01100011' + */ +function textToBinary(s) { + try { + s = unescape( encodeURIComponent(s)); + let chr, i = 0, l = s.length, out = ''; + for( ; i < l; i ++ ){ + chr = s.charCodeAt( i ).toString(2); + while(chr.length % 8 != 0 ){ chr = '0' + chr; } + out += chr; + } + return out.replace(/(\d{8})/g, '$1 ').replace(/(^\s+|\s+$)/,''); + } catch (error) { + return false; + } +} + +/** + * @description Convertis du Binaire (UTF-8) en Texte. + * @param {String} s - La chaîne de caractère contenant tous les octets à convertir + * @returns {String} + * @examples binaryToText('01100001 01100010 01100011') → 'abc' + */ +function binaryToText(s){ + try { + s = s.replace(/\s/g,'') + let i = 0, l = s.length, chr, out = ''; + for( ; i < l; i += 8){ + chr = parseInt( s.substr(i, 8 ), 2).toString(16); + out += '%' + ((chr.length % 2 == 0) ? chr : '0' + chr); + } + return decodeURIComponent(out); + } catch (error) { + return false; + } +} + +/** + * @description Convertis un Texte en Hexadécimal (UTF-8). + * @param {String} s - La chaîne de caractère à convertir + * @returns {String} + * @examples textToHexadecimal('abc') → '61 62 63' + */ +function textToHexadecimal (s) { + try { + s = unescape( encodeURIComponent( s ) ); + let chr, i = 0, l = s.length, out = ''; + for( ; i < l; i++ ){ + chr = s.charCodeAt( i ).toString( 16 ); + out += ( chr.length % 2 == 0 ) ? chr : '0' + chr; + out += " "; + } + return out.toUpperCase(); + } + catch (error) { + return false; + } +} + +/** + * @description Convertis de l'Hexadécimal (UTF-8) en Texte. + * @param {String} s - La chaîne de caractère contenant tous les nombres Hexadécimal à convertir + * @returns {String} + * @examples hexadecimalToText('61 62 63') → 'abc' + */ +function hexadecimalToText (s) { + try { + s = s.replace(/\s/g,''); + return decodeURIComponent( s.replace( /../g, '%$&' ) ); + } + catch (error) { + return false; + } +} + +/* OUTPUTS */ +const convertEncoding = { decimalToBinary, binaryToDecimal, decimalToHexadecimal, hexadecimalToDecimal, binaryToHexadecimal, hexadecimalToBinary, textToNumberUnicode, numberUnicodeToText, textToBinary, binaryToText, textToHexadecimal, hexadecimalToText }; + +function executeFunction(option, value) { + return convertEncoding[option](value); +} + +exports.convertEncodingOutput = ({ res, next }, argsObject) => { + let { value, functionName } = argsObject; + + // S'il n'y a pas les champs obligatoire + if (!(value && functionName)) { + return errorHandling(next, requiredFields); + } + + // Si la fonction de convertEncoding n'existe pas + if (!convertEncoding.hasOwnProperty(functionName)) { + return errorHandling(next, { message: "Cette conversion de convertEncoding n'existe pas." }); + } + + const result = executeFunction(functionName, value); + + // Mauvaise valeur entrée + if (!result) { + return errorHandling(next, generalError); + } + + return res.status(200).json({ result }); +} \ No newline at end of file