关于同一个问题有一些讨论,但我想再问一些,
1) 下面的双字节交换代码的可移植性如何
int ReadDouble(FILE *fptr,double *n)
{
unsigned char *cptr,tmp;
if (fread(n,8,1,fptr) != 1)
return(FALSE);
cptr = (unsigned char *)n;
tmp = cptr[0];
cptr[0] = cptr[7];
cptr[7] = tmp;
tmp = cptr[1];
cptr[1] = cptr[6];
cptr[6] = tmp;
tmp = cptr[2];
cptr[2] = cptr[5];
cptr[5] =tmp;
tmp = cptr[3];
cptr[3] = cptr[4];
cptr[4] = tmp;
return(TRUE);
}
2) 我是否应该将 float 、符号位、尾数、指数的 3 个重要部分保留为整数,然后尝试以某种方式操纵它们。
我了解浮点表示的基础知识,作为一名机械工程师并没有那么深入,但是我需要阅读一些大端文件,而我的机器是小端。稍后我可能会担心可移植性问题。但我想了解它们,也许你可以指导我做一些更直接的事情,因为这方面的信息太多,我不知道该读哪一个。
所以在一些评论之后,这应该或多或少地以可移植的方式做到这一点,对吗?对不起 C 文件指针...
double_t ReadDouble(ifstream& source) {
// read
char buf[sizeof(double_t)];
source.read(buf, sizeof(double_t));
// reverse and return
reverse( buf, buf+sizeof(double_t) );
return *(reinterpret_cast<double_t*>(buf));
}
最好的, 乌穆特
最佳答案
事情没有那么简单。仅仅因为架构对于整数是大端并不意味着它对于 float 也是大端。我听说过存储整数 big-endian 和 float little-endian 的平台。 因此,首先您应该发现源平台上 double 的实际内存表示是什么。
至于交换本身,它效率低下并且代码太多。额外的 8 字节缓冲区不会杀死你,所以为什么不这样做:
int ReadDouble(FILE* f, double* n) {
unsigned char* nbytes = reinterpret_cast<unsigned char*>(n);
unsigned char buf[sizeof(double)];
if (fread(buf, sizeof(double), 1, f) != 1) return FALSE;
for (int i = 0; i < sizeof(double); ++i) {
nbytes[i] = buf[sizeof(double)-1-i];
}
return TRUE;
}
代码更少,即使您决定手动展开循环也是如此。
关于c++ - 双字节交换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4367557/