Внимание, пожалуйста:
Я уже реализовал этот материал, но ни в коем случае не универсальный и не элегантный. Этот вопрос мотивирован моим желанием узнать больше трюков с помощью stl, а не самой проблемой.
Я думаю, что это ясно из того, как я заявил, что уже решил проблему, но многие люди в своих лучших намерениях ответили решением проблемы , а не ответами на вопрос «Как решить этот путь». Мне очень жаль, если я сформулировал этот вопрос в замешательстве. Я ненавижу тратить время людей.
Хорошо, вот оно:
Я получаю строку, полную закодированных данных.
Он входит в:
N >> 64 байта
- каждые 3 байта декодируются в значение типа int
- после того, как самое большее 64 байта (да, не делится на 3!) Приходит байт в качестве контрольной суммы
- с последующим переводом строки.
- и так продолжается.
Завершается, когда найдены 2 последовательных перевода строки.
Это выглядит как хороший или, по крайней мере, нормальный формат данных, но разбирает его элегантно
stl - настоящий бит **.
Я сделал это "вручную".
Но мне было бы интересно, если бы существовал элегантный способ с использованием stl - или, возможно, буста - магии, который не включает в себя копирование вещи.
Разъяснение:
Это становится действительно большим иногда. N >> 64 байта было больше похоже на N >>> 64 байта; -)
UPDATE
Хорошо, N> 64 байта, кажется, сбивает с толку. Это не важно.
- Датчик принимает M измерений в виде целых чисел. Кодирует каждый из них в 3 байта. и отправляет их один за другим
- когда датчик отправил 64 байта данных, он вставляет контрольную сумму в 64 байта и LF. Это не волнует, если одно из закодированных целых чисел "разбито" этим. Это просто продолжается в следующей строке. (Это дает эффект только для того, чтобы сделать данные удобочитаемыми для человека, но довольно неприятными для элегантного анализа)
- если он завершил отправку данных, он вставляет байт контрольной суммы и LFLF
Таким образом, один блок данных может выглядеть следующим образом, для N = 129 = 43x3:
|<--64byte-data-->|1byte checksum|LF
|<--64byte-data-->|1byte checksum|LF
|<--1byte-data-->|1byte checksum|LF
LF
Когда у меня M = 22 измерения, это означает, что у меня N = 66 байт данных.
После 64 байт он вставляет контрольную сумму и LF и продолжает.
Таким образом, это разбивает мое последнее измерение
который закодирован в байтах 64, 65 и 66. Теперь это выглядит так: 64, контрольная сумма, LF, 65, 66.
Поскольку кратное 3, деленное на 64, несет остаток 2 из 3 раз, и каждый раз
еще один, паршиво разбирать.
У меня было 2 решения:
- проверка контрольной суммы, объединение данных в одну строку, содержащую только байты данных, декодирование.
- пробежка с итераторами и одна неприятная конструкция if, чтобы избежать копирования.
Я просто подумал, что может быть лучше. Я размышлял о std :: transform, но он не сработает, потому что 3 байта - это одно целое.