В этом разделе перечислены свойства и методы данных типа 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();



Свойства (property)

Пример использования:

// Создать объект
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) Функция

Добавить в массив елемент(ы)

Аргументом может выступать массив, строка или число
push и append это синонемы
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


ByteArray ba.appendFloat(floatArr, swap2LE = false, swapWords = false, swapBytes = false) Функция

Добавить в массив ByteArray байтовое представление float значений из первого аргумента

floatArr - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


ByteArray ba.replaceFloat(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция

Заменить в массиве ByteArray байтовое представление float значений из второго аргумента

pos - позиция замены intArr - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


ByteArray ba.appendDouble(doubletArr, swap2LE = false, swapWords = false, swapBytes = false) Функция

Добавить в массив ByteArray байтовое представление double значений из первого аргумента

doubletArr - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
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 - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


ByteArray ba.replaceDouble(pos, intArr, swap2LE = false, swapWords = false, swapBytes = false) Функция

Заменить в массиве ByteArray байтовое представление double значений из второго аргумента

pos - позиция замены intArr - массив значений или просто число
swap2LE - меняет положение байт с big-endian на little-endian
swapWords - меняет положение слов в посылке (0x00 0x01 0x02 0x03 > 0x02 0x03 0x00 0x01)
swapBytes - меняет положение байт в посылке (0x00 0x01 0x02 0x03 > 0x01 0x00 0x03 0x02)
Внимание! Порядок трансформирования: Сначало выполняется swap2LE затем swapWords
Внимание! Если исходный массив меньше чем результирующий, исходный будет расширен


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 ]"


ByteArray ba.swap16() процедура
ByteArray ba.swap32() процедура
ByteArray ba.swap64() процедура
ByteArray ba.swapWords() процедура
ByteArray ba.swapBytes() процедура
Функции для преобразования масcива

Пример использования

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);
     }
 }

  • Описание объектов