更改s_addr的第一个字节

Change first byte of s_addr

本文关键字:第一个 字节 addr 更改      更新时间:2023-10-16

我想设置一个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;

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

*(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

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

unsigned long ul;
*reinterpret_cast<char*>(&ul) = 0;
// ina is struct sockaddr_in
char* address = a1 = inet_ntoa(ina.sin_addr);
*address = x;
or
*(char*)&addr.s_addr = x;