Насколько корректная и оптимальная моя реализация кодирования base64 (это кусочек прошивки для микроконтроллера, стандартной реализации нет и важна скорость):
const uint8_t base64_digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
...
uint8_t rx_data[33];
rx_data[32] = 0;
nrf24l01_rxPayload(rx_data, 32);
uint8_t rx_data_base64[44 + 2];
uint8_t i, j = 0;
for (i = 0; i < 33; i += 3) {
uint8_t b1 = rx_data[i], b2 = rx_data[i + 1], b3 = rx_data[i + 2];
rx_data_base64[j++] = base64_digits[b1 >> 2];
rx_data_base64[j++] = base64_digits[((b1 & 0x03) << 4) | (b2 >> 4)];
rx_data_base64[j++] = base64_digits[((b2 & 0x0F) << 2) | (b3 >> 6)];
if (i < 30) {
rx_data_base64[j++] = base64_digits[b3 & 0x3F];
} else {
rx_data_base64[j++] = '=';
}
}
rx_data_base64[j++] = '\r';
rx_data_base64[j++] = '\n';
usbCdcSendData(rx_data_base64, j, 1);
Насчёт if'а внутри for'а - компилятор при -O2 разворачивает мой цикл, так что он не является проблемой для производительности.
Суть в том, что Qt не хочет нормально декодировать полученную строку.
void MainWindow::serialPortDataReady() {
lineBuffer += port->readAll(); // lineBuffer - QString, поле класса MainWindow
while (true) {
int lineEnd = lineBuffer.indexOf("\r\n");
if (lineEnd >= 0) {
QString line = lineBuffer.left(lineEnd);
lineBuffer.remove(0, lineEnd + 2);
QByteArray packetBytes = QByteArray::fromBase64(line.toUtf8());
if ((unsigned int)packetBytes.length() == sizeof(AdcDataFrame)) {
AdcDataFrame *frame = (AdcDataFrame*)packetBytes.data();
a = frame->battery_voltage;
frameCounter++;
}
} else {
break;
}
}
}