是一个二进制文件,每个记录有6字节。每个记录的前3个字节包含纬度信息,后3个字节包含经度信息。每个24位的值代表弧度乘以0X1FFFFF。这是我正在处理的任务。因为我已经好几年没有使用C++了,所以花费的时间比我预想的要长得多。在搜索过程中,我看到了这个算法,它对我来说很有意义。
问题是语法问题,我限制了按照另一个人编程的方式工作。我不理解如何将CHAR“data”存储到INT中。如果“data”是一个数组,是否更有意义?因为它接收24个整数的信息存储在BYTE中。
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“data”存储到INT中。如果“data”是一个数组,是否更有意义?因为它接收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;
}
我非常感激任何帮助或提示,即使您不理解也没关系,一点线索或提示对我都有很大的帮助。我只需要和某个人交流。
>>
的出现,sing-extension 已经在发生了。请看我在底部添加的注释。 - Sergey Kalinichenko