如何将数字转换为特定的字节数组?

How can I convert a number into a specific bytearray?

我想将数字 (例如 1000) 转换为非常具体的 ByteArray。 至少我猜它是一个字节数组,因为它说它是一个。

@ByteArray(\x1\xd9\xd0\xcb[=18=]\x1[=18=][=18=][=18=][=18=][=18=]\xc2[=18=][=18=][=18=]X[=18=][=18=]\x3)[=19=][=19=]\x2"[=20=][=20=][=20=]\xca[=20=][=20=][=20=]w[=20=][=20=]\x3![=19=][=19=]\x2\x1a\0\0\0\0\0\0)

(此 ByteArray 用于 vlc 的“vlc-qt-interface.ini”)

我不知道这个字节数组使用的是什么格式,我自己也无法解码。 你知道如何解码它然后将数字编码成这种格式吗? 这种格式可能至少包含两个数字,可能是四个(我想转换为与使用的数字相同的数字)。

这比看起来要复杂一些。对于可能的最短答案,请参阅此错误报告(打开),它基本上说 restoreGeometry 例程是 too complicated。错误报告中的一些批评是什么会让你很难按照你的意图去做。

较长的答案是,它是一个 QByteArray,作为 saveGeometry() 的结果被写出。相同的 QByteArray 在开始时被反馈到其中以设置几何。您发布的实际字符串是一个 ini 转义字符串:https://doc.qt.io/qt-5/qsettings.html

QSettings will accept Latin-1 encoded INI files, but generate pure ASCII files, where non-ASCII values are encoded using standard INI escape sequences.

据我所知,几何结构没有记录在案。但是,对 restoreGeometry() 函数中 qwidget.cpp 的回顾揭示了以下内容:

它以一个神奇的 32 位数字 0x1D9D0CB(编码时为 \x1\xd9\xd0\xcb)开头。接下来的 16 位是 'major version',之后的 16 位是 'minor version'。然后,依次为:

const quint32 magicNumber = 0x1D9D0CB
quint16 majorVersion;    
quint16 minorVersion;
QRect restoredFrameGeometry;
QRect restoredGeometry;
QRect restoredNormalGeometry;
qint32 restoredScreenNumber;
quint8 maximized;
quint8 fullScreen;
qint32 restoredScreenWidth = 0;

每个 QRect 似乎是按左、上、右、然后下的顺序排列的:

QDataStream &operator<<(QDataStream &s, const QRect &r)
{
    if (s.version() == 1)
        s << (qint16)r.left() << (qint16)r.top()
          << (qint16)r.right() << (qint16)r.bottom();
    else
        s << (qint32)r.left() << (qint32)r.top()
          << (qint32)r.right() << (qint32)r.bottom();
    return s;
}

QRect 是否使用版本 1 或其他版本有点不清楚,但根据编码字符串的粗略大小,我很确定它将是 16 位。

我不确定您实际上想影响哪个几何图形。与其尝试编码和更改这些,我建议提出一个简单的 QT 程序,您可以自己打开并使用 QSettings 来保存所需的大小并加载到 ini 文件中供以后使用。

答案的完整性:当调用 saveGeometry 时,它 returns 一个 QByteArray,然后在 QSettings 中 set/saved。

'extended.cpp'(在 VLC 中)的这段代码片段似乎在加载时恢复它,默认大小为 400,如果找不到设置则为 200:

if( !restoreGeometry( getSettings()->value("EPanel/geometry").toByteArray() ) )
{
    resize( QSize( 400, 280 ) );

    MainInterface *p_mi = p_intf->p_mi;
    if( p_mi && p_mi->x() > 50 )
        move( ( p_mi->x() - frameGeometry().width() - 10 ), p_mi->y() );
    else
        move ( 450 , 0 );
}