2

我想设置一个s_addr变量的第一个字节,它只是一个无符号长整数。这可能吗?如果可以,怎么做?

它不是字节数组,所以我不能像这样访问它:

struct in_addr addr;
addr.s_addr[0] = 1; // Set this byte to the number 1, or in hex: 0x01

编辑:

事实证明,我需要最后一个(即第 4 个)字节而不是第一个字节。但是由于您的帮助,我现在有了:

*((char *)&addr.s_addr + 3) = 1;
4

3 回答 3

3

一种丑陋且可能不安全(但仍被广泛采用)的方式是这样的:

*(char *)&addr.s_addr = 42;

如果您知道这addr.s_addr是一个unsigned long问题,并且如果“第一个”字节是指“最低有效”字节,那么您可以使用按位运算符作为更安全的替代方案,例如

addr.s_addr &= ~0xffUL; // clear previous contents of LS byte
addr.s_addr |=  0x01UL; // set LS byte to 1
于 2013-10-23T12:54:28.530 回答
2

您获取它的地址,将其解释为指向 a 的指针char并取消引用它:

unsigned long ul;
*reinterpret_cast<char*>(&ul) = 0;
于 2013-10-23T12:54:13.090 回答
1
// ina is struct sockaddr_in
char* address = a1 = inet_ntoa(ina.sin_addr);
*address = x;

or

*(char*)&addr.s_addr = x;
于 2013-10-23T13:05:49.060 回答