我正在尝试找到一个可以将字节转换为int的Qt函数,其具有与我在下面使用的相同的字节序。我觉得我肯定在这里重新发明轮子,并且Qt库中肯定有一些东西可以做到这一点。它存在吗?
// 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.
}
}
编辑:数据总是大端(无论什么操作系统),所以例如101将是[0,0,0,101],78000是[0,1,48, 176]。
答案 0 :(得分:3)
答案 1 :(得分:1)
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()
)。
答案 2 :(得分:1)
您的代码非常简单易用,但您可以像这样使用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);
}
请注意,字节序将与运行它的机器相同。