Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt将字符串转换为基数16中的int,但保留基数16的值_C++_Qt - Fatal编程技术网

C++ Qt将字符串转换为基数16中的int,但保留基数16的值

C++ Qt将字符串转换为基数16中的int,但保留基数16的值,c++,qt,C++,Qt,这件事困扰了我好几天,我真的不知道该怎么麻烦你们 我在Qt中有一个输入,可以从用户输入中获取任何数字 用户输入数字后,我得到数字并将其转换为十六进制(以16为基数),如果十六进制大于1字节,我将其拆分为1字节大小。我已经完成了所有的转换和拆分 现在我的问题是,在转换和拆分之后,十六进制保留在QString的数据类型中,但是为了在QBtyeArray中发送,我需要转换回int 你们能告诉我有什么方便的方法把QString转换回int吗?我已经尝试了很多方法,但是所有的转换都给了我以10为基数的值,

这件事困扰了我好几天,我真的不知道该怎么麻烦你们

我在
Qt
中有一个输入,可以从用户输入中获取任何数字

用户输入数字后,我得到数字并将其转换为十六进制(以16为基数),如果十六进制大于1字节,我将其拆分为1字节大小。我已经完成了所有的转换和拆分

现在我的问题是,在转换和拆分之后,十六进制保留在QString的数据类型中,但是为了在QBtyeArray中发送,我需要转换回int

你们能告诉我有什么方便的方法把QString转换回int吗?我已经尝试了很多方法,但是所有的转换都给了我以10为基数的值,我希望该值以16为基数,但以int为单位

示例:用户在lineEdit中输入10800(以10为基数),我从lineEdit中检索10800,然后我将其转换为以16为基数,因此10800的十六进制是2A30,在我进行转换后,值2A30是字符串,我可能知道如何将类型转换为int,但值仍然保持为2A30,但不会转换回10800(基数10)

我得到的最接近的答案是通过这个方法

unsigned int value = QString("0x2A").toUInt(&ok, 16);

int abcde = sprintf(abc, "%x", value);

qDebug()<<QString::number(value);

QByteArray test_a = abc; 
如果我的问题不够清楚,请告诉我。我使用的是
Qt 5.2.1


谢谢!!!

为什么要进行转换等?我假设你想要发送一个任意长的整数,有效地以256为基数,即一次发送一个字节,而不是一次发送一个十进制数字。我还假设你想将它们表示为大端,即最重要的以256为基数的数字排在第一位。比如说,如果你必须发送12384928,它将以字节188、250、160(0xbc、0xfa、0xa0)的形式发送

这很容易做到:

QByteArray numberToBytes(const QString &number) {
  QByteArray result;
  bool ok = false;
  auto value = number.toLongLong(&ok);
  if (ok) {
    int n = sizeof(value);
    while (value && n--) {
      result.append(quint8(value & 0xFF));
      value = value >> 8;
    }
    std::reverse(result.begin(), result.end());
  }
  return result;
}

QString bytesToNumber(const QByteArray &bytes) {
  qlonglong value = 0;
  for (auto b : bytes)
    value = (value << 8) | quint8(b);
  return QString::number(value);
}

void test() {
  Q_ASSERT(sizeof(qlonglong) == 8);
  Q_ASSERT(numberToBytes("256") == QByteArray::fromRawData("\x01\x00", 2));
  Q_ASSERT(numberToBytes("2134789") == QByteArray::fromRawData("\x20\x93 \x05", 3));
  Q_ASSERT(numberToBytes("-58931") == QByteArray::fromRawData("\xFF\xFF\xFF\xFF\xFF\xFF\x19\xCD");
}

也许您试图通过提前知道字符串是一个数字来减小它,从而以最佳方式表示它。您希望这些字符串的长度是多少,以及您对数据报大小的限制是什么?

为什么要进行转换等?我想您希望发送任意长的整数,有效地以256为基数,I例如,一次发送一个字节,而不是一次发送一个十进制数字。我还假设您希望将它们表示为大端,即最重要的基256位排在第一位。例如,如果您必须发送12384928,它将作为字节188、250、160(0xbc、0xfa、0xa0)发送

这很容易做到:

QByteArray numberToBytes(const QString &number) {
  QByteArray result;
  bool ok = false;
  auto value = number.toLongLong(&ok);
  if (ok) {
    int n = sizeof(value);
    while (value && n--) {
      result.append(quint8(value & 0xFF));
      value = value >> 8;
    }
    std::reverse(result.begin(), result.end());
  }
  return result;
}

QString bytesToNumber(const QByteArray &bytes) {
  qlonglong value = 0;
  for (auto b : bytes)
    value = (value << 8) | quint8(b);
  return QString::number(value);
}

void test() {
  Q_ASSERT(sizeof(qlonglong) == 8);
  Q_ASSERT(numberToBytes("256") == QByteArray::fromRawData("\x01\x00", 2));
  Q_ASSERT(numberToBytes("2134789") == QByteArray::fromRawData("\x20\x93 \x05", 3));
  Q_ASSERT(numberToBytes("-58931") == QByteArray::fromRawData("\xFF\xFF\xFF\xFF\xFF\xFF\x19\xCD");
}

也许您试图通过提前知道字符串是一个数字来缩小它,从而以最佳方式表示它。您希望这些字符串的长度是多少,以及您对数据报大小的限制是多少?

您的问题假定有一个解决方案,但没有解释您正在解决的问题。请在开头添加一段t至少提供2或3个转换所需输入的示例(即用户输入的字符串)和您期望的输出(即
QByteArray
)@KubaOber我已经添加了一个新的示例,用户的输入应该是以10为基数的int,之后我需要转换为以16为基数的,但是转换后类型变成了QString,所以我想将其转换回int,但值仍然是我转换的值。清楚吗?如果不清楚,请再次告诉我。我会尝试解释得更清楚。不清楚您要的是。10800和0x2a30在存储为int时是相同的数字。十进制和十六进制是显示相同值的不同方式。抱歉,我知道是相同的值,但当我通过QByteArray发送时,byteArray只接受int,所以我需要将数据类型从字符串转换为整数。我指定了wh首先,我需要在下面发送数据报。我需要指定每个字节要发送什么。因此,我必须将其拆分并转换为int,然后放入数据报[]字节数组。请准确显示字节数组中将包含哪些字节!!!!。我们猜测您需要的字节是
0x2a
0x30
,但顺序是什么,我们猜对了吗?您正在为转换编写规范:所以编写规范。规范必须提供一些示例。输入是
QString
输出是一个
QByteArray
。显示一些对
{string,array}演示你认为正确的输入-输出对。问题的大部分文本是无关的。例如,在数据报中显示“代码> \x02 \x10\x00 \x00 < /代码>:使用示例来帮助您的规范。您的问题假定了一个解决方案,但不能解释您正在解决的问题。请在开始时添加段落。g至少提供2或3个转换所需输入的示例(即用户输入的字符串)和您期望的输出(即
QByteArray
)@KubaOber我已经添加了一个新的示例,用户的输入应该是以10为基数的int,之后我需要转换为以16为基数的,但是转换后类型变成了QString,所以我想将其转换回int,但值仍然是我转换的值。清楚吗?如果不清楚,请再次告诉我。我会尝试解释得更清楚。不清楚您要的是。10800和0x2a30在存储为int时是相同的数字。十进制和十六进制是显示相同值的不同方式。抱歉,我知道是相同的值,但当我通过QByteArray发送时,byteArray只接受int,所以我需要将数据类型从字符串转换为整数。我指定了wh首先,我需要在下面发送数据报。我需要指定每个字节要发送什么。因此,我必须将其拆分并转换为int,然后放入数据报[]字节数组。请准确显示字节数组中将包含哪些字节!!!!。我们猜测您需要的字节是
0x2a
0x30
,但顺序如何,我们猜对了吗?您正在为转换编写规范:所以编写规范。规范必须提供一些示例。输入是
QByteArray serialize(const QString &str, bool withCRC = false) {
  QByteArray result;
  QDataStream ds(&result, QIODevice::WriteOnly);
  ds << str;
  if (withCRC) ds << qChecksum(result.constData(), result.size());
  return result;
}

QString deserialize(const QByteArray &packet, bool withCRC = false) {
  QString result;
  QDataStream ds(packet);
  ds >> result;
  if (withCRC) {
    quint16 crc;
    ds >> crc;
    crc ^= qChecksum(packet.data(), packet.size() - 2);
    if (crc) return {};
  }
  return result;
}
QByteArray serialize(const QString &str, bool withCRC = false) {
  QByteArray result;
  QDataStream ds(&result, QIODevice::WriteOnly);
  ds << str.toUtf8();
  if (withCRC) ds << qChecksum(result.constData(), result.size());
  return result;
}

QString deserialize(const QByteArray &packet, bool withCRC = false) {
  QByteArray result;
  QDataStream ds(packet);
  ds >> result;
  if (withCRC) {
    quint16 crc;
    ds >> crc;
    crc ^= qChecksum(result.constData(), result.size());
    if (crc) return {};
  }
  return QString::fromUtf8(result);
}