В этом разделе перечислены свойства и методы данных типа ByteArray
Тип данных ByteArray - это обертка над QByteArray
Этот тип данных облегчает работу с двоичными массивами
new ByteArray() Создать объект
// Создать объект var a = new ByteArray(); a.append([0x01, 0x02, 0x03, 0x04, 0x05]) // или var a = new ByteArray(5); // или var a = new ByteArray([0x01, 0x02, 0x03, 0x04, 0x05]); // или var f = File() f.open(stuff@include/init.js, 'r') var a = new ByteArray(f); // в массиве будет содержимое файла f.close();
Пример использования:
// Создать объект var ba = new ByteArray(); //свойство параметра чтение/запись: var prVal = ba.prop; // Чтение ba.prop = '/n'; // Запись
int ba.size Чтение/запись
int ba.length Чтение/запись
Размер массива (при записи значения массив меняет количество элементов)
var ba = new ByteArray(0); ba.size = 5; // Массив стал таким [0, 0, 0, 0, 0]
Object ba.object Чтение
возвращает ссылку на нативный объект Js
Object ba.qobject Чтение
возвращает ссылку на объект Qt
if(http.argCnt > 1 && http.argKeyByNum(0) == 'sendPartFile')
{
var f = new File();
......
switch(http.method)
{
case 'POST':
// Запись сократилась до одной строки
// http.postBodyByteArr - это объект ByteArray (данные защифрованы в Base64)
// .fromBase64() - расшифровка Base64 в массив ByteArray
// .qobject - передать QObject (который владеет ByteArray) в функцию записи
f.write( http.postBodyByteArr.fromBase64().qobject );
break;
case 'GET':
f.write( http.argByKeyByteArr('data').fromBase64().qobject );
break;
}
.....
}
arr ba.array Чтение/запись
Работа с нативным массивом
var ba = new ByteArray([1, 2, 3, 4, 5, 6, 7, 8]);
var ar = ba.array; // ar = [1, 2, 3, 4, 5, 6, 7, 8]
post.log('i','' + JSON.stringify(ba, null, 3))
post.log('i','' + JSON.stringify(ar, null, 3))
arr ba.qarray Чтение/запись
Возвращает QByteArray
var ba = new ByteArray([1, 2, 3, 4, 5, 6, 7, 8]); var qar = ba.qarray; // qar = [1, 2, 3, 4, 5, 6, 7, 8] console.log(ba) console.log(qar)
bool ba.isByteArray Чтение
Флаг, объект является ByteArray
var ba = new ByteArray([1, 2, 3, 4, 5, 6, 7, 8]);
if(ba.isByteArray)
{
post.log('i','' + JSON.stringify(ba, null, 3))
}
bool ba.equals(ba) Функция
Сравнить с массивом
var ba1 = new ByteArray("STARTTLS");
var ba2 = new ByteArray(ba1);
var eq = ba1.equals(ba2);
post.log('i',(eq ? 'true' : 'false') + ' ' + ba2.toLatin1String()) // -> true STARTTLS
ba2[2] = 'a'
var eq = ba1.equals(ba2);
post.log('i',(eq ? 'true' : 'false') + ' ' + ba2.toLatin1String()) // -> false STaRTTLS
ByteArray ba.chop(n) Процедура
Удалить n байт с конца массива и возвратить текущий объект
var ba = new ByteArray("STARTTLS\r\n");
ba.chop(2); // ba == "STARTTLS"
ByteArray ba.truncate(n) Процедура
Обрезать массив до n символов и возвратить текущий объект
var ba = new ByteArray("Stockholm");
ba.truncate(5); // -> ba == "Stock"
ByteArray ba.resize(n) Процедура
Установить количество элементов и возвратить текущий объект
var ba = new ByteArray("Stockholm");
ba.truncate(5) // -> ba == "Stock"
.resize(7); // -> ba == "Stock\0\0"
ByteArray ba.fill(char, size = -1) Процедура
Инициализировать массив начальными данными и возвратить текущий объект
var ba = new ByteArray("Stockholm");
ba.fill(0, 5); // -> ba == "\0\0\0\0\0" + "holm"
ba.fill(0); // -> ba == "\0\0\0\0\0\0\0\0\0"
ByteArray ba.random(size = -1) Процедура
Инициализировать массив случайными данными и возвратить текущий объект
var ba = new ByteArray(); ba.random(16); // что равноценно следующей записи ba.resize(16); ba.random();
ByteArray ba.invert() функция
Инвертировать каждое значение и возвратить новый массив
var ba = new ByteArray(); ba.random(16); var ba_invert = ba.invert();
ByteArray ba.revers() функция
Развернуть массив задом-наперед (первый байт станет последним)
var ba = new ByteArray('abcd');
var reversBa = ba.revers(); // reversBa === 'dcba'
ByteArray ba.left(n) Функция
Возвратить первых n элементов
var ba1 = new ByteArray("STARTTLS");
var ba2 = ba1.left(5);
post.log('i', ba2.toLatin1String()) // -> START
ByteArray ba.right(n) Функция
Возвратить последних n элементов
var ba1 = new ByteArray("STARTTLS");
var ba2 = ba1.right(3);
post.log('i', ba2.toLatin1String()) // -> TLS
ByteArray ba.mid(pos, n = -1) Функция
Возвратить n элементов начиная с pos
var ba1 = new ByteArray("Five pineapples");
var ba2 = ba1.mid(5, 4); // ba2 == "pine"
var ba3 = ba1.mid(5); // ba3 == "pineapples"
ByteArray ba.remove(pos, n = -1) Функция
Удалить n элементов начиная с pos и возвратить текущий объект
var ba1 = new ByteArray("Montreal");
ba1.remove(1, 4).remove(0, 1);
post.log('i', ba1.toLatin1String()) // -> "eal"
Array ba.split(separator) Функция
Разбить ByteArray на несколько (исходный массив не изменяется). В качестве separator выступают Number, String, Array, ByteArray
var ba1 = new ByteArray("Montreal");
var baList = ba1.split('r');
post.log('i', ba1.toLatin1String() ) // -> "Montreal"
post.log('i', 'length: ' + baList.length ) // -> length: 2
post.log('i', baList[0].toAscii() ) // -> "Mont"
post.log('i', baList[1].toAscii() ) // -> "eal"
//-----------------------------------------------------------
var ba1 = new ByteArray([0,1,2,0,3,4,0,5,6,0]);
var baList = ba1.split(0); // -> 5 ByteArray: [][1,2] [3,4] [5,6] []
var baList = ba1.split(1); // -> 2 ByteArray: [0] [2,0,3,4,0,5,6,0]
var baList = ba1.split([2,0,3]); // -> 2 ByteArray: [0,1] [4,0,5,6,0]
String ba.join(separator = ',') Функция
Собрать строку из ByteArray чередуя его элементы сепаратором
Полностью повторяет функционал Array.join()
var ba = new ByteArray('qwerty');
post.log('i', ba.join()) // -> 'q,w,e,r,t,y'
post.log('i', ba.join('-')) // -> 'q-w-e-r-t-y'
post.log('i', ba.join('')) // -> 'qwerty'
ByteArray ba.toBase64() Функция
Закодировать в Base64
var ba1 = new ByteArray("i love jCjS forever!");
ba1 = ba1.toBase64();
post.log('i', ba1.toLatin1String()) // -> "aSBsb3ZlIGpDalMgZm9yZXZlciE="
ByteArray ba.fromBase64(arg) Функция
Разкодировать из Base64. Если есть аргумент, то будет обработан он, иначе будет обработано содержимое ba
var ba1 = new ByteArray("aSBsb3ZlIGpDalMgZm9yZXZlciE=");
ba1 = ba1.fromBase64();
post.log('i', ba1.toLatin1String()) // -> "i love jCjS forever!"
//-----------------------------------------
var ba1 = new ByteArray("12345678");
var ba2 = ba1.fromBase64("aSBsb3ZlIGpDalMgZm9yZXZlciE=");
post.log('i', ba1.toLatin1String()) // -> "12345678"
post.log('i', ba2.toLatin1String()) // -> "i love jCjS forever!"
ByteArray ba.toLower() Функция
ByteArray ba.toUpper() Функция
Привести к единому регистру
var ba1 = new ByteArray("i love jCjS forever!");
ba1.toLower(); // -> "i love jcjs forever!"
ba1.toUpper(); // -> "I LOVE JCJS FOREVER!"
ByteArray ba.simplified() Функция
Удалить все непечатные символы
var ba1 = new ByteArray(" lots\t of\nwhitespace\r\n ");
ba1 = ba1.simplified();
post.log('i', ba1.toLatin1String()) // -> "lots of whitespace"
ByteArray ba.trimmed() Функция
Обрезать начальные и конечные непечатные символы
var ba1 = new ByteArray(" lots\t of\nwhitespace\r\n ");
ba1 = ba1.trimmed(); // -> "lots\t of\nwhitespace"
String ba.toLatin1String() Функция
Преобразовать массив в строку
ByteArray ba.replace(before, after) Функция
Заменить в массиве данные
var ba1 = new ByteArray("1234 5678");
ba1.replace("1234", "5678"); // -> "5678 5678"
ByteArray ba.insert(ind, data) Функция
вставить в массив данные
var ba1 = new ByteArray("1234 5678");
ba1.insert(4, "abcd "); // -> "5678 abcd 5678"
int ba.indexOf(find, startInd) Функция
int ba.lastIndexOf(find, startInd) Функция
Поиск данных в массиве
var ba1 = new ByteArray("1234 5678");
ba1.indexOf("1234"); // -> 0
ba1.indexOf("1234", 1); // -> -1
ba1.indexOf("5678"); // -> 5
ba1.lastIndexOf("1234");// -> 0
ba1.lastIndexOf("5678");// -> 5
bool ba.startsWith(find) Функция
bool ba.endsWith(find) Функция
Проверка на начало или конец
var ba1 = new ByteArray("1234 5678");
ba1.startsWith("1234"); // -> true
ba1.startsWith("5678"); // -> false
ba1.endsWith("1234"); // -> false
ba1.endsWith("5678"); // -> true
bool ba.contains(find) Функция
Проверка наличия данных в массиве
var ba1 = new ByteArray("1234 5678");
ba1.contains("4 5"); // -> true
ba1.contains("5678"); // -> true
ba1.contains("abcd"); // -> false
int ba.count(find) Функция
Подсчитывает количество найденных
var ba1 = new ByteArray("1234 5678 1234");
ba1.count("4 5"); // -> 1
ba1.count("1"); // -> 2
ba1.count("1234"); // -> 2
ba1.count("abcd"); // -> 0
ByteArray ba.fromHex(hexString) Функция
преобразует HEX строку в бинарные данные
var ba1 = new ByteArray('abcdef');
var ba2 = ba1.fromHex("01020304");
console.log(ba1.toLatin1String()); // -> "abcdef"
console.log(ba2.qarray); // -> [0x00, 0x01, 0x02, 0x03, 0x04]
//-------------------------------------------------------------
var ba1 = new ByteArray("01020304");
ba1.fromHex();
console.log(ba1.qarray); // -> [0x00, 0x01, 0x02, 0x03, 0x04]
ByteArray ba.slice() Функция
ByteArray ba.splice() Функция
ByteArray ba.pop() Функция
ByteArray ba.shift() Функция
ByteArray ba.unshift() Функция
Все пять функций ведут себя абсолютно также как и их одноименные функции JS Array
const char ba.toVariant() Функция
Возвращает ссылку на буфер. Я не представляю ситуацию, где можно применить данную функцию
ByteArray ba.concat(Variant) Функция
Возвращает новый массив с добавленными значениями.
Массив, на котором вызвана функция concat, не меняется
var ba1 = new ByteArray();
ba1.append(0x55);
post.log('[ ' + ba1.toHex() + ' ]'); // [ 0x55 ]
var ba2 = ba1.concat('a', 'b', 'c');
var ba3 = ba1.concat(['a', 'b', 'c']);
var ba4 = ba1.concat(['a', 'b'], 'c');
post.log('[ ' + ba1.toHex() + ' ]'); // [ 0x55 ]
post.log('[ ' + ba2.toHex() + ' ]'); // [ 0x55 0x61 0x62 0x63 ]
post.log('[ ' + ba3.toHex() + ' ]'); // [ 0x55 0x61 0x62 0x63 ]
post.log('[ ' + ba4.toHex() + ' ]'); // [ 0x55 0x61 0x62 0x63 ]
ВНИМАНИЕ!!! Если вызвать функцию concat на нативном JS массиве,
то результат будет несколько различаться с вывзовом concat на ByteArray
Чтобы исправить ситуацию, необходимо в init скрипте заменить прототип функции Array.concat
var ar1 = [1, 2, 3];
var ar2 = [4, 5, 6];
var ba1 = new ByteArray(ar1);
var ba2 = new ByteArray(ar2);
var ba3 = ba1.concat(ba2);
post.log('[ ' + ba1.toHex(',') + ' ]'); // [ 0x01,0x02,0x03 ]
post.log('[ ' + ba2.toHex(',') + ' ]'); // [ 0x04,0x05,0x06 ]
post.log('[ ' + ba3.toHex(',') + ' ]'); // [ 0x01,0x02,0x03,0x04,0x05,0x06 ]
var ar3 = ar1.concat(ar2);
post.log(JSON.stringify(ar1)); // [1,2,3]
post.log(JSON.stringify(ar2)); // [4,5,6]
post.log(JSON.stringify(ar3)); // [1,2,3,4,5,6]
var ar4 = ar1.concat(ba2);
post.log('[ ' + ba2.toHex(',') + ' ]'); // [ 0x01,0x02,0x03 ]
post.log(JSON.stringify(ar1)); // [1,2,3]
post.log(JSON.stringify(ar4)); // [1,2,3, {0:4, 1:5, 2:6}]
// заменить прототип функции Array.concat
post.evalScript("byteArray.concat.js");
var ar5 = ar1.concat(ba2);
post.log('[ ' + ba2.toHex(',') + ' ]'); // [ 0x01,0x02,0x03 ]
post.log(JSON.stringify(ar1)); // [1,2,3]
post.log(JSON.stringify(ar5)); // [1,2,3,4,5,6]
ByteArray ba.push(Variant) Функция
ByteArray ba.append(Variant) Функция
Добавить в массив елемент(ы)
Аргументом может выступать массив, строка или число
var ba = new ByteArray();
ba.append(0x55);
post.log('[ ' + ba.printHex() + ' ]'); // [ 0x55 ]
ba.push('a');
post.log('[ ' + ba.printHex() + ' ]'); // [ 0x55 0x61 ]
ba.push('test');
post.log('[ ' + ba.printHex() + ' ]'); // [ 0x55 0x61 0x74 0x65 0x73 0x74 ]
ByteArray ba.appendConv(String, codecName) Функция
Добавить в массив строку предварительно сконвертировав ее в необходимую кодировку
var ba = new ByteArray();
ba.appendConv('Строка на кирилице', 'CP866');
ByteArray ba.appendShort(shortArr, swap2LE = false) Функция
ByteArray ba.appendInt16(shortArr, swap2LE = false) Функция
ByteArray ba.appendUInt16(shortArr, swap2LE = false) Функция
Добавить в массив ByteArray байтовое представление short значений из первого аргумента
shortArr - массив значений или просто число
var ba = new ByteArray();
ba.appendShort(65535); //или ba.appendShort([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0xFF 0xFF ]"
ba.resize(0)
ba.appendShort([1, 255, 65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x01 0x00 0xFF 0xFF 0xFF ]"
ba.resize(0)
ba.appendShort([1, 255, 65535], true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x01 0x00 0xFF 0x00 0xFF 0xFF ]"
ByteArray ba.insertShort(pos, shortArr, swap2LE = false) Функция
ByteArray ba.insertInt16(pos, shortArr, swap2LE = false) Функция
ByteArray ba.insertUInt16(pos, shortArr, swap2LE = false) Функция
Вставить в массив ByteArray байтовое представление short значений из второго аргумента
pos - позиция вставки shortArr - массив значений или просто число
var ba = new ByteArray();
ba.appendShort(65535); //или ba.appendShort([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0xFF 0xFF ]"
ba.insertShort(1, [1, 2]); // был "[ 0xFF 0xFF ]"
post.log('[ ' + ba.printHex() + ' ]'); // стал "[ 0xFF 0x00 0x01 0x00 0x02 0xFF ]"
ByteArray ba.replaceShort(pos, shortArr, swap2LE = false) Функция
ByteArray ba.replaceInt16(pos, shortArr, swap2LE = false) Функция
ByteArray ba.replaceUInt16(pos, shortArr, swap2LE = false) Функция
Заменить в массиве ByteArray байтовое представление short значений из второго аргумента
pos - позиция замены shortArr - массив значений или просто число
var ba = new ByteArray();
ba.appendShort(65535); //или ba.appendShort([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0xFF 0xFF ]"
ba.replaceShort(0, 0xAABB); // был "[ 0xFF 0xFF ]"
post.log('[ ' + ba.printHex() + ' ]'); // стал "[ 0xAA 0xBB ]"
ba.replaceShort(1, 0xCCDD); // был "[ 0xAA 0xBB ]"
post.log('[ ' + ba.printHex() + ' ]'); // стал "[ 0xAA 0xCC 0xDD ]"
ByteArray ba.appendInt(intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.appendInt32(intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.appendUInt32(intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Добавить в массив ByteArray байтовое представление int значений из первого аргумента
intArr - массив значений или просто число
var ba = new ByteArray();
ba.appendInt(65535); //или ba.appendInt([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0xFF 0xFF ]"
ba.resize(0)
ba.appendInt([1, 255, 65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0xFF 0xFF ]"
ba.resize(0)
ba.appendInt([1, 255, 65535], true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0x00 0xFF 0xFF 0x00 0x00 ]"
ba.resize(0)
ba.appendInt([1, 255, 65535], false, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x01 0x00 0x00 0x00 0xFF 0x00 0x00 0xFF 0xFF 0x00 0x00 ]"
ByteArray ba.insertInt(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.insertInt32(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.insertUInt32(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Втавить в массив ByteArray байтовое представление int значений из второго аргумента
pos - позиция вставки intArr - массив значений или просто число
var ba = new ByteArray();
ba.appendInt(0xAABBCCDD);
ba.insertInt(2, [1]); // был "[ 0xAA 0xBB 0xCC 0xDD ]"
post.log('[ ' + ba.printHex() + ' ]'); // стал "[ 0xAA 0xBB 0x00 0x00 0x00 0x01 0xCC 0xDD ]"
ByteArray ba.replaceInt(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.replaceInt32(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.replaceUInt32(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Заменить в массиве ByteArray байтовое представление int значений из второго аргумента
pos - позиция замены intArr - массив значений или просто число
var ba = new ByteArray();
ba.appendInt( 0xAABBCCDD);
ba.replaceInt(2, 0x00000001); // был "[ 0xAA 0xBB 0xCC 0xDD ]"
post.log('[ ' + ba.printHex() + ' ]'); // стал "[ 0xAA 0xBB 0x00 0x00 0x00 0x01 ]"
ByteArray ba.appendInt64(int64Arr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Добавить в массив ByteArray байтовое представление int64 значений из первого аргумента
int64Arr - массив значений или просто число
var ba = new ByteArray();
ba.appendInt64(65535); //или ba.appendInt([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF ]"
ba.resize(0)
ba.appendInt64([65535, 65535]); //или ba.appendInt([65535])
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF 0x00 0x00 0x00 0x00 0x00 0x00 0xFF 0xFF ]"
ba.resize(0)
ba.appendInt64(0x44332211)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x44 0x33 0x22 0x11 ]"
ba.resize(0)
ba.appendInt64(0x44332211, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x11 0x22 0x33 0x44 0x00 0x00 0x00 0x00 ]"
ba.resize(0)
ba.appendInt64(0x44332211, false, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x22 0x11 0x44 0x33 ]"
ba.resize(0)
ba.appendInt64(0x44332211, false, false, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x33 0x44 0x11 0x22 ]"
ba.resize(0)
ba.appendInt64(0x44332211, false, true, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0x00 0x00 0x11 0x22 0x33 0x44 ]"
ba.resize(0)
ba.appendInt64(0x44332211, true, false, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x22 0x11 0x44 0x33 0x00 0x00 0x00 0x00 ]"
ba.resize(0)
ba.appendInt64(0x44332211, true, true, true)
post.log('[ ' + ba.printHex() + ' ]'); //Выведет в лог "[ 0x44 0x33 0x22 0x11 0x00 0x00 0x00 0x00 ]"
ByteArray ba.insertInt64(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Втавить в массив ByteArray байтовое представление int64 значений из второго аргумента
pos - позиция вставки intArr - массив значений или просто число
ByteArray ba.replaceInt64(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
ByteArray ba.replaceUInt64(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Заменить в массиве ByteArray байтовое представление int64 значений из второго аргумента
pos - позиция замены intArr - массив значений или просто число
ByteArray ba.appendFloat(floatArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Добавить в массив ByteArray байтовое представление float значений из первого аргумента
floatArr - массив значений или просто число
var ff, ba = new ByteArray()
ba.appendFloat(5.5); //или ba.appendFloat([5.5])
ff = jsext.toFloat(ba.array)
post.log('1[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "1[ 0x40 0xB0 0x00 0x00 ] 5.5"
ba.resize(0)
ba.appendFloat(1.25);
ff = jsext.toFloat(ba.array)
post.log('2[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "2[ 0x3F 0xA0 0x00 0x00 ] 1.25"
ba.resize(0)
ba.appendFloat([1.25, 5.5])
ff = jsext.toFloat(ba.array)
post.log('3[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "3[ 0x3F 0xA0 0x00 0x00 0x40 0xB0 0x00 0x00 ] 1.25,5.5"
ba.resize(0)
ba.appendFloat([5.5, 1.25], true)
ff = jsext.toFloat(ba.array, true)
post.log('4[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "4[ 0x00 0x00 0xB0 0x40 0x00 0x00 0xA0 0x3F ] 5.5,1.25"
ba.resize(0)
ba.appendFloat([5.5, 1.25], false, true)
ff = jsext.toFloat(ba.array, false, true)
post.log('5[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "5[ 0x00 0x00 0x40 0xB0 0x00 0x00 0x3F 0xA0 ] 5.5,1.25"
ba.resize(0)
ba.appendFloat([5.5, 1.25], false, false, true)
ff = jsext.toFloat(ba.array, false, false, true)
post.log('6[ ' + ba.printHex() + '] ' + ff); //Выведет в лог "6[ 0xB0 0x40 0x00 0x00 0xA0 0x3F 0x00 0x00 ] 5.5,1.25"
ByteArray ba.insertFloat(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Втавить в массив ByteArray байтовое представление float значений из второго аргумента
pos - позиция вставки intArr - массив значений или просто число
ByteArray ba.replaceFloat(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Заменить в массиве ByteArray байтовое представление float значений из второго аргумента
pos - позиция замены intArr - массив значений или просто число
ByteArray ba.appendDouble(doubletArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Добавить в массив ByteArray байтовое представление double значений из первого аргумента
doubletArr - массив значений или просто число
var ff, ba = new ByteArray()
ba.appendDouble(11.9) //или ba.appendDouble([11.9])
ff = jsext.toDouble(ba.array)
post.log('[ ' + ba.printHex() + ']' + ff); //Выведет в лог "[ 0x40 0x27 0xCC 0xCC 0xCC 0xCC 0xCC 0xCD ]11.9"
ba.resize(0)
ba.appendDouble(11.9, true)
ff = jsext.toDouble(ba.array, true)
post.log('[ ' + ba.printHex() + ']' + ff); //Выведет в лог "[ 0xCD 0xCC 0xCC 0xCC 0xCC 0xCC 0x27 0x40 ]11.9"
ByteArray ba.insertDouble(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Втавить в массив ByteArray байтовое представление float значений из второго аргумента
pos - позиция вставки intArr - массив значений или просто число
ByteArray ba.replaceDouble(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция
Заменить в массиве ByteArray байтовое представление double значений из второго аргумента
pos - позиция замены intArr - массив значений или просто число
List(Number) ba.toShort(int pos, int cnt = -1, swap2LE = false) Функция
List(Number) ba.toInt16(int pos, int cnt = -1, swap2LE = false) Функция
List(Number) ba.toUInt16(int pos, int cnt = -1, swap2LE = false) Функция
List(Number) ba.toInt(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toInt32(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toUInt32(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toInt64(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toUInt64(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toFloat(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toDouble(int pos, int cnt = -1, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toInt64d( int pos, int cnt = -1, div = 10000.0, swap2LE = false, swapWords = false, swapBytes = false) Функция
List(Number) ba.toUInt64d(int pos, int cnt = -1, div = 10000.0, swap2LE = false, swapWords = false, swapBytes = false) Функция
Функции для преобразования в масcив чисел
Похожие преобразования делают функции из объекта jsext
Агрументы:
Пример использования
var ba = new ByteArray();
ba.appendDouble([10.1, 11.1, 12.2, 13.3, 14.4, 15.5], true)
post.log('[ ' + (ba.toDouble(0, -1, true)) + ' ]'); //Выведет в лог "[ 10.1, 11.1, 12.2, 13.3, 14.4, 15.5 ]"
post.log('[ ' + jsext.toDouble(ba.array, true) + ' ]'); //Выведет в лог "[ 10.1, 11.1, 12.2, 13.3, 14.4, 15.5 ]"
ba.resize(0)
ba.appendDouble([10.1, 11.1, 12.2, 13.3, 14.4, 15.5])
post.log('[ ' + (ba.toDouble(8*0,1)) + ' ]'); //Выведет в лог "[ 10.1 ]"
post.log('[ ' + (ba.toDouble(8*1,2)) + ' ]'); //Выведет в лог "[ 11.1, 12.2 ]"
post.log('[ ' + (ba.toDouble(8*3,3)) + ' ]'); //Выведет в лог "[ 13.3, 14.4, 15.5 ]"
Пример использования
var arr = [0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07] var ba = new ByteArray(arr); post.log(ba.printHex()) // Выведет в лог 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 ba.resize(0) ba.append(arr) ba.swap16(); post.log(ba.printHex()) // Выведет в лог 0x01 0x00 0x03 0x02 0x05 0x04 0x07 0x06 ba.resize(0) ba.append(arr) ba.swap32(); post.log(ba.printHex()) // Выведет в лог 0x03 0x02 0x01 0x00 0x07 0x06 0x05 0x04 ba.resize(0) ba.append(arr) ba.swap64(); post.log(ba.printHex()) // Выведет в лог 0x07 0x06 0x05 0x04 0x03 0x02 0x01 0x00 ba.resize(0) ba.append(arr) ba.swapWords(); post.log(ba.printHex()) // Выведет в лог 0x02 0x03 0x00 0x01 0x06 0x07 0x04 0x05 ba.resize(0) ba.append(arr) ba.swapBytes(); post.log(ba.printHex()) // Выведет в лог 0x01 0x00 0x03 0x02 0x05 0x04 0x07 0x06
String ba.printHex() Функция
String ba.toHex() Функция
Возвратить HEX представление массива (printHex и toHex синонемы)
Если в аргументах указана строка, то она будет разделителем
Если в аргументах указана true, то будет использована короткое представление байта
var ba = new ByteArray();
ba.appendFloat(5.5);
post.log('[ ' + ba.toHex() + ' ]'); //Выведет в лог "[ 0x00 0x00 0xB0 0x40 ]"
post.log('[ ' + ba.toHex(' ', 1) + ' ]'); //Выведет в лог "[ 00 00 B0 40 ]"
post.log('[ ' + ba.toHex(true, ' ') + ' ]'); //Выведет в лог "[ 00 00 B0 40 ]"
post.log('[ ' + ba.toHex('-', true) + ' ]'); //Выведет в лог "[ 00-00-B0-40 ]"
post.log('[ ' + ba.toHex(', ') + ' ]'); //Выведет в лог "[ 0x00, 0x00, 0xB0, 0x40 ]"
post.log('[ ' + ba.toHex(false, ', ') + ' ]'); //Выведет в лог "[ 0x00, 0x00, 0xB0, 0x40 ]"
post.log('[ ' + ba.toHex(', ', 1) + ' ]'); //Выведет в лог "[ 00, 00, B0, 40 ]"
ByteArray ba.crc16(len) Функция для расчета контрольной суммы CRC-16 IBM (Modbus RTU)
bool ba.crc16check() Функция проверки контрольной суммы CRC-16 IBM (Modbus RTU)
ByteArray ba.crc16_ccitt(len) Функция для расчета контрольной суммы (CRC-16 CCITT)
ByteArray ba.crc32(len=0) Функция для расчета контрольной суммы CRC-32 IBM
hexString ba.csAscii(len) Функция для расчета контрольной суммы (Modbus ASCII)
hex или int ba.csAscii(numb)
hex или int ba.csAscii(len, numb)
hex или int ba.csAscii(numb, len)
Аргументы:
len - длинна обрабатываемых данных (если отрицательное значение, то данные будут обрезаны с конца массива)
numb - числовое представление (по умолчанию выдает HEX значение)
ВНИМАНИЕ!!! аргумент numb может принимать только булевое значение true или false
ByteArray ba.csPolimaster(len) Функция для приборов ООО Полимастер
quint16 ba.csElemer() Функция для приборов контроля температуры Элемер
Функции для расчета контрольных сумм
Похожие преобразования делают функции из объекта jsext
Если вы проверяете данные полученные от объекта SerialTaskWrap,
то лучше воспользоваться встроенным
функционалом контроля контрольных сумм
Пример использования
// Cформировать команду
var ba = new ByteArray();
ba.append(this.param.adr) // addr
ba.append(0x10) // func
ba.appendShort(140+val[0]*2);// addr registr
ba.appendShort(2); // cnt registrs (количество отсылаемых регистров)
ba.append(4); // cnt write bytes (количество отсылаемых байт)
//------------------------> Данные для записи в регистры
ba.appendInt(val[1], false, true); // отсылаемые данные 1 int = 2 регистра = 4 байта
// добавить в отсылаемые данные контрольную сумму
var getCrc16 = ba.crc16();
ba.append(getCrc16);
if(ba.crc16check()) post.log('i', 'crc в норме')
String ba.md4(salt = '') Функция для расчета хэша md4
String ba.md5(salt = '') Функция для расчета хэша md5
String ba.sha1(salt = '') Функция для расчета хэша sha1
String ba.sha224(salt = '') Функция для расчета хэша sha224 (только в Qt5)
String ba.sha256(salt = '') Функция для расчета хэша sha256 (только в Qt5)
String ba.sha384(salt = '') Функция для расчета хэша sha384 (только в Qt5)
String ba.sha512(salt = '') Функция для расчета хэша sha512 (только в Qt5)
Пример использования
var ba = new ByteArray(user + ':' + pass);
post.log( ba.md4() );
post.log( ba.md5() );
post.log( ba.sha1() );
post.log( ba.md4('scdfcadfxax#$#%') );
post.log( ba.md5('Srt45756#$%') );
post.log( ba.sha1('fgh$^%$%^') );
ByteArray ba.toConv(codecName) Сконвертировать байтовый массив в нужной кодировке
ByteArray ba.toConv(codecName, Variant) Сконвертировать Variant в нужной кодировке (не изменяя текущий массив)
Пример использования
var ba = new ByteArray();
var ba1251 = ba.toConv('CP1251', 'Кириллица'); // (ba.length === 0)
ba.resize(0).append('Кириллица'); // ( ba.length === 9 utf-8)
var ba866 = ba.toConv('CP866'); // (ba866.length === 9 CP866) (ba.length === 9 utf-8)
ByteArray ba.fromConv(codecName) Сконвертировать байтовый массив из кодировки codecName в UTF-8
ByteArray ba.fromConv(codecName, Variant) Сконвертировать Variant из кодировки codecName в UTF-8 (не изменяя текущий массив)
Пример использования
var ba = new ByteArray();
var ba1251 = ba.toConv('CP1251', 'Кириллица'); // (ba1251.length === 9 CP1251) (ba.length === 0)
var baUtf8 = ba1251.fromConv('CP1251') // (baUtf8.length === 9 UTF-8)
var baUtf8 = ba.fromConv('CP1251', ba1251); // (ba.length === 0) (baUtf8.length === 9 UTF-8)
ByteArray ba.zip(compressionLevel = -1) Функция для упаковки ZLib
ByteArray ba.unz() Функция для распаковки (возвращает false при ошибке распаковки)
// создать массив размером 2 кб и установить все елементы в 0
var ba = new ByteArray().resize(2048).fill(1);
var pack = ba.zip();// упаковать
if(!pack.equals(ba))
post.log('i', 'Упаковано: ' + ba.length +' > '+ pack.length +
' [экономия ' +(ba.length-pack.length)+ ' байт]');
var unpack = pack.unz();// распаковать
if(unpack) {
post.log('i', 'массивы' + (unpack.equals(ba) ? ' ' : ' не ') + 'идентичны');
} else {
post.log('e', 'ошибка распаковки');
}
ByteArray ba.encrypt(pass) Функция для шифрования (алгоритм AES-256-CBC)
ByteArray ba.decrypt(pass) Функция для дешифрации
var msg = new ByteArray("исходная строка");
var psw = '0123456789012345'; // пароль
var cipher = msg.encrypt(psw);// зашифровать
if(cipher) {
var hex = cipher.toHex(1,'');
post.log('i', 'Зашифровано: "' + hex + '"');
var dec = new ByteArray(hex).fromHex().decrypt(psw); // Расшифровать
if(dec) post.log('i', 'Дешифровано: "' + dec.toAscii() + '"');
else post.log('e', 'Не дешифровано');
}
// функция шифрует сообщение, для отправки в jCjS
function encrypt_jcjs($data, $psw) {
$key = sha1($psw); $key.= sha1($key); // преобразовать пароль в 32 байтное слово
$cipher="AES-256-CBC";
$vs = openssl_cipher_iv_length($cipher); // получить длинну вектора
$iv = openssl_random_pseudo_bytes($vs); // сгенерировать вектор инициализации
$key = hex2bin( substr($key, 0, 64) ); // преобразовать пароль в 256-битный массив
$cipher_raw = openssl_encrypt($data, $cipher, $key, true, $iv);
if($cipher_raw !== False)
return bin2hex($cipher_raw).bin2hex($iv);
return $cipher_raw;
}
// функция дешифрации сообщения, зашифрованного в jCjS
function decrypt_jcjs($hex, $psw) {
$key = sha1($psw); $key.= sha1($key); // преобразовать пароль в 32 байтное слово
$en = substr($hex, 0, strlen($hex) - 32); // выделить что расшифровать
$iv = substr($hex, -32); // выделить вектор инициализации
$key = hex2bin( substr($key, 0, 64) ); // преобразовать пароль в 256-битный массив
$en = hex2bin($en); // преобразовать данные в бинарный массив
$iv = hex2bin($iv); // преобразовать вектор в бинарный массив
return openssl_decrypt($en, 'AES-256-CBC', $key, true, $iv);
}
//error_reporting(E_ALL); ini_set('display_errors', 1);
$origMsg = 'Message: Decrypted SUCCESSED';
$passwrd = '0123456789012345';
$hex_str = '62b3961df97f2f329078e65b821c12948fda06e70ab4f60b0e1972a677004c0063392146e874f987e42fe6dd5436d535';
$output = decrypt_jcjs($hex_str, $passwrd);
echo "\n " .($output!==False?'Успешно':'Не') . " расшифровано: '" .$output . "'";
$output = encrypt_jcjs($origMsg, $passwrd); // зашифровать $origMsg
echo "\n '" .$output . "'";
$output = decrypt_jcjs($output, $passwrd);
echo "\n " .($output===$origMsg?'Успешно':'Не') . " расшифровано: '" .$output . "'";
В PHP v. < 5.4.0 отсутствует функция hex2bin. Можно воспользоваться ее аналогом
if (!function_exists('hex2bin')) {
function hex2bin($data) {
static $old;
if ($old === null) {
$old = version_compare(PHP_VERSION, '5.2', '<');
}
$isobj = false;
if (is_scalar($data) || (($isobj = is_object($data)) && method_exists($data, '__toString'))) {
if ($isobj && $old) {
ob_start();
echo $data;
$data = ob_get_clean();
}
else {
$data = (string) $data;
}
}
else {
trigger_error(__FUNCTION__.'() expects parameter 1 to be string, '.
gettype($data) . ' given', E_USER_WARNING);
return;//null in this case
}
$len = strlen($data);
if ($len % 2) {
trigger_error(__FUNCTION__.'(): Hexadecimal input string must have an even length', E_USER_WARNING);
return false;
}
if (strspn($data, '0123456789abcdefABCDEF') != $len) {
trigger_error(__FUNCTION__.'(): Input string must be hexadecimal string', E_USER_WARNING);
return false;
}
return pack('H*', $data);
}
}