LINUX.ORG.RU

Реализация base64-кодирования

 , ,


0

1

Насколько корректная и оптимальная моя реализация кодирования 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;
		}
	}
}
★★★★★

Насколько корректная

потести

оптимальная

потести

MyTrooName ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.