我正在尝试为分配交换字节,我认为这是实现它的方法。
指向要反转的标量对象 size是对象的字节数。
void *ReverseEndian(void *p, size_t size)
{
char *head = (char *)&p;
char *tail = head + size - 1;
for (; tail > head; --tail, ++head) {
char temp = *head;
*head = *tail;
*tail = temp;
}
return p;
}
他上面有什么明显的错误吗?我的教授的测试代码出错:
#define TestIt(a, b) TestReverse((void *)&(a),\
ReverseEndian((void *)&(b), sizeof(b)), sizeof(b))
int main()
char ch = 0x01, ch1 = ch;
short sh = 0x0123, sh1 = sh;
long lo = 0x01234567, lo1 = lo;
float fl = 1234.567e27F, fl1 = fl;
double db = 123456.567890, db1 = db;
long double ld = 987654.321053e-204L, ld1 = ld;
void *vp = (void *)0x0123, *vp1 = vp;
char *cp = (char *)0x4567, *cp1 = cp;
char *ip = (char *)0x89AB, *ip1 = ip;
TestIt(ch1, ch);
TestIt(sh1, sh);
TestIt(lo1, lo);
TestIt(fl1, fl);
TestIt(db1, db);
TestIt(ld1, ld);
TestIt(vp1, vp);
TestIt(cp1, cp);
TestIt(ip1, ip);
printf("ReverseEndian succeeded!\n");
return EXIT_SUCCESS;
}
void TestReverse(const void *before, const void *after, size_t size)
{
const char *cpBfore = (const char *)before;
const char *cpAfter = (const char *)after;
const char *tail;
for (tail = cpBfore + (size - 1); size; --size)
if (*tail-- != *cpAfter++)
{
fprintf(stderr, "ReverseEndian failed!\n");
exit(EXIT_FAILURE);
}
}
答案 0 :(得分:4)
下面
char *head = (char *)&p;
你正在定义一个指向另一个指针的指针。所以你有指针 - >指针 - >字节显然不是你想要的。幸运的是程序没有崩溃。
必须为char *head = (char *)p;
,以便从p
指向的内存中读取每个字节。
答案 1 :(得分:2)
p
是一个指针变量(即一个保存某个内存地址的变量),并在以下行中:
char *head = (char *)&p;
...您正在使用&p
,它为您提供指针变量本身的地址,而不是指针变量包含的内存地址值(指向)。
你的意思是这样做吗?
char *head = (char *)p;
顺便说一句,您的源代码似乎颠倒了整个字符串的顺序,例如“你好” - > “olleH”(除非我读错了)
这与逆转 endianness 不同。术语 endian 通常是指多字节值,它首先与最高或最低有效字节一起存储。
例如,十进制值43981以十六进制表示为ABCD
。在 big-endian 中,最重要的字节(AB
)将存储在较低的内存位置,而最不重要的字节(CD
)将存储在内存位置越高。
在 little-endian 中,顺序颠倒过来;最不重要的,然后是最重要的:CDAB
。
答案 2 :(得分:1)
char *head = (char *)&p
应为char *head = (char *)p
答案 3 :(得分:0)
你不应该使用p
的地址这应该有效:
void *ReverseEndian(void *p, size_t size)
{
char *head = (char *)p; // here
char *tail = head + size - 1;
for (; tail > head; --tail, ++head) {
char temp = *head;
*head = *tail;
*tail = temp;
}
return p;
}