Show I2P peer addresses

PR #18845.
This commit is contained in:
Vladimir Golovnev
2023-06-01 17:16:03 +03:00
committed by GitHub
parent b27e839405
commit 160af4feef
7 changed files with 128 additions and 7 deletions

View File

@@ -1,5 +1,6 @@
/*
* Bittorrent Client using Qt and libtorrent.
* Copyright (C) 2023 Vladimir Golovnev <glassez@yandex.ru>
* Copyright (C) 2018 Mike Tzou (Chocobo1)
*
* This program is free software; you can redistribute it and/or
@@ -68,3 +69,45 @@ const QByteArray Utils::ByteArray::midView(const QByteArray &in, const int pos,
: len;
return QByteArray::fromRawData(in.constData() + pos, validLen);
}
QByteArray Utils::ByteArray::toBase32(const QByteArray &in)
{
const char alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
const char padchar = '=';
const qsizetype inSize = in.size();
auto tmp = QByteArray((inSize + 4) / 5 * 8, Qt::Uninitialized);
qsizetype inIndex = 0;
char *out = tmp.data();
while (inIndex < inSize)
{
// encode 5 bytes at a time
qsizetype inPadLen = 5;
int64_t chunk = 0;
while (inPadLen > 0)
{
chunk |= static_cast<int64_t>(static_cast<uchar>(in.data()[inIndex++])) << (--inPadLen * 8);
if (inIndex == inSize)
break;
}
const int outCharCounts[] = {8, 7, 5, 4, 2};
for (int i = 7; i >= 0; --i)
{
if (i >= (8 - outCharCounts[inPadLen]))
{
const int shift = (i * 5);
const int64_t mask = static_cast<int64_t>(0x1f) << shift;
const int charIndex = (chunk & mask) >> shift;
*out++ = alphabet[charIndex];
}
else
{
*out++ = padchar;
}
}
}
return tmp;
}