c ++ порядок замены элементов в байтовом массиве - PullRequest
0 голосов
/ 10 октября 2018

Я пишу код для Arduino C ++.

У меня есть байтовый массив с шестнадцатеричными байтовыми значениями, например:

20 32 36 20 E0 EC 20 F9 F0 E9 E9 E3 F8 5C 70 5C 70 5C 73 20 E3 E2 EC 20 F8 E0 E5 E1 EF 20 39 31 5C

В этих байтах четыре цифры ASCII:

HEX 0x32 - это номер 2 в коде ascii

HEX 0x35 - это номер 5 в коде ascii

HEX 0x39 - это номер 9 в коде ascii

и т. Д.on ....

https://www.ascii -codes.com / cp862.html

Таким образом, шестнадцатеричные значения 32, 36 представляют число 26, а 39, 31представляют 91.

Я хочу найти эти числа и инвертировать каждую группу, чтобы (в этом примере) 62 и 19 были представлены вместо 26 и 91.

Таким образом, выходные данные должнывыглядят так:

20 36 32 20 E0 EC 20 F9 F0 E9 E9 E3 F8 5C 70 5C 70 5C 73 20 E3 E2 EC 20 F8 E0 E5 E1 EF 20 31 39 5C

Числа не обязательно должны быть двумя цифрами, но могут быть чем угодно в 0-1000

Я также знаю, что каждая группатаким числам предшествует шестнадцатеричное значение 20, если это помогает.

Я сделал это в C # (с некоторой помощью пользователей переполнения стека :-)):

string result = Regex.Replace(HexMessage1,
                           @"(?<=20\-)3[0-9](\-3[0-9])*(?=\-20)",
                           match => string.Join("-", Transform(match.Value.Split('-'))));

 private static IEnumerable<string> Transform(string[] items)
        {
            // Either terse Linq:
            // return items.Reverse();

            // Or good old for loop:
            string[] result = new string[items.Length];

            for (int i = 0; i < items.Length; ++i)
                result[i] = items[items.Length - i - 1];

            return result;
        }

Может кто-нибудьмне помочь заставить его работать на C ++?

1 Ответ

0 голосов
/ 10 октября 2018

Цикл по массиву, элемент за элементом, ищите 0x32 или 0x39.Если найден, проверьте следующий байт (если в пределах границ), чтобы увидеть, соответствует ли он 0x36 или 0x31 (соответственно).Если это так, то поменяйте местами текущий и следующий байт.Продолжите цикл, пропуская текущий и следующий байт.

...