gpt4 book ai didi

c++ - 在 C++ 中将 24 位整数(2s 补码)转换为 32 位整数

转载 作者:太空宇宙 更新时间:2023-11-03 10:41:28 28 4
gpt4 key购买 nike

The dataFile.bin is a binary file with 6-byte records. The first 3 bytes of each record contain the latitude and the last 3 bytes contain the longitude. Each 24 bit value represents radians multiplied by 0X1FFFFF

这是我一直在努力的任务。我已经很多年没有使用 C++ 了,所以它花费的时间比我想象的要长 -_-。谷歌搜索后,我看到了这个对我有意义的算法。

int interpret24bitAsInt32(byte[] byteArray) {     
int newInt = (
((0xFF & byteArray[0]) << 16) |
((0xFF & byteArray[1]) << 8) |
(0xFF & byteArray[2])
);
if ((newInt & 0x00800000) > 0) {
newInt |= 0xFF000000;
} else {
newInt &= 0x00FFFFFF;
}
return newInt;
}

问题是语法问题 我限制按照其他人编写此程序的方式工作。我不明白如何将 CHAR“数据”存储到 INT 中。如果“数据”是一个数组不是更有意义吗?自其接收到的24个整数信息存储成一个BYTE。

double BinaryFile::from24bitToDouble(char *data) {
int32_t iValue;

// ****************************
// Start code implementation
// Task: Fill iValue with the 24bit integer located at data.
// The first byte is the LSB.
// ****************************
//iValue +=
// ****************************
// End code implementation
// ****************************
return static_cast<double>(iValue) / FACTOR;
}

bool BinaryFile::readNext(DataRecord &record)
{
const size_t RECORD_SIZE = 6;
char buffer[RECORD_SIZE];
m_ifs.read(buffer,RECORD_SIZE);
if (m_ifs) {
record.latitude = toDegrees(from24bitToDouble(&buffer[0]));
record.longitude = toDegrees(from24bitToDouble(&buffer[3]));
return true;
}
return false;
}

double BinaryFile::toDegrees(double radians) const
{
static const double PI = 3.1415926535897932384626433832795;
return radians * 180.0 / PI;
}

我感谢任何帮助或提示,即使您不理解任何线索或提示都会对我有很大帮助。我只是需要和某人谈谈。

最佳答案

I am not understanding how I can store the CHAR "data" into an INT.

char是数字类型,将它们组合成一个int是没有问题的.

Since its receiving 24 integers of information stored into a BYTE

它是 24 位,不是字节,所以只有三个整数值需要组合。

在不使用条件的情况下产生相同结果的更简单方法如下:

int interpret24bitAsInt32(byte[] byteArray) {     
return (
(byteArray[0] << 24)
| (byteArray[1] << 16)
| (byteArray[2] << 8)
) >> 8;
}

想法是将作为输入提供的三个字节存储到四字节 int 三个字节中。 , 然后向下移动一个字节。这样程序会自动对您的号码进行符号扩展,避免条件执行。

关于可移植性的注意事项:此代码不可移植,因为它采用 32 位整数大小。使其便携使用 <cstdint> 类型:

int32_t interpret24bitAsInt32(const std::array<uint8_t,3> byteArray) {
return (
(const_cast<int32_t>(byteArray[0]) << 24)
| (const_cast<int32_t>(byteArray[1]) << 16)
| (const_cast<int32_t>(byteArray[2]) << 8)
) >> 8;
}

它还假定 24 位数字的最高有效字节存储在 byteArray 的初始元素中。 ,然后是中间元素,最后是最低有效字节。

关于符号扩展的注意事项:这段代码通过在高三个字节中构造值然后将其右移来自动处理符号扩展,而不是在低三个字节中构造值马上字节。这个额外的移位操作确保 C++ 为我们处理符号扩展结果。

关于c++ - 在 C++ 中将 24 位整数(2s 补码)转换为 32 位整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35876000/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com