【问题标题】:QByteArray from hex literal unicode characters来自十六进制文字 unicode 字符的 QByteArray
【发布时间】:2020-10-30 17:30:07
【问题描述】:

我看到 QByteArray 如何与 Ascii 字符相互转换 我看到了如何使用 QString::toUtf8() 将 QString 转换为 utf-8

但是,我看不到如何使用包含 unicode 字符的十六进制文字初始化 QByteArray。 unicode 字符太大而无法放入 char 中。然而,它们将适合无符号字符。

如果我运行以下代码:

QString test = "¢";
QByteArray utf8bytes = test.toUtf8();

我的调试器说:

utf8bytes = { (char)-62 '\302', (char)-94 '\242' }

不管那是什么意思……

我最终想要完成的是能够在以下单元测试代码中提供测试数据:

void stomp_frame_tests::test_nonAsciiCharactersInHeaderKey()
{
    /* Frame we are testing with:
    SEND
    Bad¢Character:Erroneus
    destination:/queue/a
    content-type:text/json;charset=utf-8
    content-length:22

    This is a test message
    */

    const char data[]   = {0x53, 0x45, 0x4e, 0x44, 0x0a, 0x42, 0x61, 0x64, 0xc2, 0xa2, 0x43, 0x68, 0x61, 0x72, 0x61,
                          0x63, 0x74, 0x65, 0x72, 0x3a, 0x45, 0x72, 0x72, 0x6f, 0x6e, 0x65, 0x75, 0x73, 0x0a, 0x64,
                          0x65, 0x73, 0x74, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x2f, 0x71, 0x75, 0x65,
                          0x75, 0x65, 0x2f, 0x61, 0x0a, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x79,
                          0x70, 0x65, 0x3a, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, 0x3b, 0x63, 0x68,
                          0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x0a, 0x63, 0x6f, 0x6e,
                          0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x3a, 0x32, 0x32, 0x0a,
                          0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x65, 0x73, 0x74,
                          0x20, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x00};
    auto testData = QByteArray::fromRawData(data, sizeof(data));
}

这当然会失败,因为 0xc2 和 0xa2 太大而无法放入字符中。您将如何使用适当的数据初始化 QByteArray?

【问题讨论】:

  • 0xc2 和 0xa2 还在一个字节的范围内,所以当然可以初始化为QByteArray。调试器的输出是因为数据类型是char。如果您将其声明为unsigned char,您将看到您期望的值。
  • @wthung 你不能用 const unsigned char * 初始化一个 QByteArray,编译器会给你一个错误。
  • 是的,你会得到一个编译器错误。但是我的观点是 char 或 unsigned char 只是一个字节。该值可以是 0xc2、194、-62,取决于您解释它的数据类型。

标签: qt


【解决方案1】:

也许你正在寻找 QByteArrayLiteral:

auto byteArray = QByteArrayLiteral("\x01\x02\x03\x04\x05");

QByteArrayLiteral Documentation

【讨论】:

    猜你喜欢
    • 2011-05-14
    • 2018-02-14
    • 2014-08-24
    • 2015-11-20
    • 2016-08-04
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多