Qt是否有一种将字节转换为int的方法,反之亦然
Does Qt have a way of converting bytes to int and vice versa?
我正试图找到一个Qt函数,它可以将字节转换为int,其endianness与我下面使用的endianness相同。我觉得我肯定在重新发明轮子,而且Qt-libs中肯定已经有东西可以做到这一点了。它存在吗?
// TODO: qt must have a built in way of converting bytes to int.
int IpcReader::bytesToInt(const char *buffer, int size)
{
if (size == 2) {
return
(((unsigned char)buffer[0]) << 8) +
(unsigned char)buffer[1];
}
else if (size == 4) {
return
(((unsigned char)buffer[0]) << 24) +
(((unsigned char)buffer[1]) << 16) +
(((unsigned char)buffer[2]) << 8) +
(unsigned char)buffer[3];
}
else {
// TODO: other sizes, if needed.
return 0;
}
}
// TODO: qt must have a built in way of converting int to bytes.
void IpcClient::intToBytes(int value, char *buffer, int size)
{
if (size == 2) {
buffer[0] = (value >> 8) & 0xff;
buffer[1] = value & 0xff;
}
else {
// TODO: other sizes, if needed.
}
}
编辑:数据是总是big-endian(无论什么操作系统),所以例如101是[0,0,01101],78000是[0],1,48176]。
以下功能似乎适合您的需求:
-
qFromBigEndian()
-
qToBigEndian()
发件人:#include <QtEndian>
您的代码非常简单易懂,但您可以像这样使用Qt的QByteArray(注意:我没有尝试编译它):
int IpcReader::bytesToInt(const char *buffer, int size)
{
QByteArray b(buffer, size);
return b.toInt();
}
void IpcClient::intToBytes(int value, char *buffer, int size)
{
QByteArray b = QByteArray::number(value);
strncpy(buffer, (const char*)b, size);
}
请注意,endianness将与运行它的机器相同。
QByteArray
和QDataStream
是否足够?
int IpcReader::bytesToInt(const char *buffer, int size)
{
QByteArray byteArr(buffer,size);
QDataStream ds(&byteArr,QIODevice::ReadOnly);
if(little_endian_usage) // little endian check or something similar here
ds.setByteOrder(QDataStream::LittleEndian);
else
ds.setByteOrder(QDataStream::BigEndian);
int ret;
if(size == 2){
qint16 tmp;
ds >> tmp;
ret = tmp;
} else if(size == 4){
qint32 tmp;
ds >> tmp;
ret = tmp;
} else if(size == 1){
qint8 tmp;
ds >> tmp;
ret = tmp;
}
return ret;
}
如果您不想创建缓冲数据的副本,可以使用QByteArray byteArr =
QByteArray::fromRawData(buffer, size)
。您也可以使用QDataStream
将int写回QByteArray
或原始缓冲区(后者使用QByteArray::fromRawData()
)。
相关文章:
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 是什么导致了这种使用三进制而不是短整型的有符号int到无符号int转换
- 将字符串中的 int 转换为字母;
- 主.cpp:18:20:错误:从"int*"转换为"int"会失去精度 [-fa
- 将非常大的 int 转换为双倍,在某些计算机上会损失精度
- 如何将矢量<int>转换为字符数组?
- C++ 无法从 const int* 转换为 const_iterator
- 我不断收到错误 C2440'=':无法从"int *(__cdecl *)(int *,int *,int,int)"转换为"int *
- 如何将 int[4] 转换为 std::array<int,4>?
- 如何将data[i].int转换为vaible
- 将 int 转换为字符串,然后连接另一个变量以创建完整扩展名,然后将其转换为 const_char*
- 将私有矩阵形式 int 转换为双 C++
- 无法将参数 1 从 'int' 转换为 'int &'
- 将 int 转换为字符串后始终得到 0
- isspace 函数的性能警告,从 int 转换为布尔值
- 将大 int 转换为浮点数,而不舍入 c++
- 错误:无法将'uint8* {aka unsigned int*}'转换为"常量emxArray_uint8_T*"?
- 将未签名的INT转换为BCD
- 在 C++ 中将 int 转换为双精度