我正在存储IP地址值插入char数组(uint8_t)其大小是4个字节,而不是的,我需要存储该值成单个整数,如何做到这一点需要一个字符串值存储到int,而不是4字节大小的字符数组
uint8_t ip[4];
str = "192.168.1.1";
sscanf(str,"%hhu.%hhu.%hhu.%hhu",&ip[0],&ip[1],&ip[2],&ip[3]);
上述代码是我用于存储IP地址值成char(uint8_t) array
我正在存储IP地址值插入char数组(uint8_t)其大小是4个字节,而不是的,我需要存储该值成单个整数,如何做到这一点需要一个字符串值存储到int,而不是4字节大小的字符数组
uint8_t ip[4];
str = "192.168.1.1";
sscanf(str,"%hhu.%hhu.%hhu.%hhu",&ip[0],&ip[1],&ip[2],&ip[3]);
上述代码是我用于存储IP地址值成char(uint8_t) array
即使您的问题已经很难回答,我非常喜欢您的问题,所以我决定为您解决问题并实施解决方案。希望这能解决你的问题:
/**
* The problem:
*
* 1 9 2 . 1 6 8 . 0 0 0 . 0 0 1
*
* How to store this in an int (32 bits)?
*
* Hum, let's see: 2^8 = 0-255 (stores values from 0 to 255)
*
* 2^(8 + 8 + 8 + 8) = 2^32 = sizeof(int) = 4 => nice!
*
* We can store four numbers from 0 to 255 in it, great!
*
*
* Draft of solution:
*
* int ipaddress = 0; //0x00000000
*
* ipaddress = (192 << 32 - 8*1) || (168 << 32 - 8*2) || (0 << 32 - 8*3) || 1;
*
* classA_part = (ipaddress & 0xff000000) >> (32 - 8*1)
* classB_part = (ipaddress & 0xff0000) >> (32 - 8*2)
* classC_part = (ipaddress & 0xff00) >> (32 - 8*3)
* classD_part = ipaddress & 0xff
*
* Let's implement shall we?!
*/
初步解决方案:
#define UPPER32 24
#define UPPER16 16
#define UPPER8 8
int main(void)
{
int ipaddr = 192 << UPPER32 | 168 << UPPER16 | 0 << UPPER8 | 1; //192 168 000 001
printf("ip address: %d.%d.%d.%d\n",
((ipaddr & 0xff000000) >> UPPER32) & 0xff,
(ipaddr & 0xff0000) >> UPPER16,
(ipaddr & 0xff00) >> UPPER8,
(ipaddr & 0xff)
);
return 0;
}
注意,因为你正在管理的位来控制你如何存储的东西在其中,你需要的位移回自己在最低有效位的位置,以便你真正得到你的价值观。
也要注意这个部分((ipaddr & 0xff000000) >> UPPER32) & 0xff
这个工程在我的机器上没有& 0xff
,因为我的机器是64位,并且我的64位整数的扩展信号是0,如果你的机器架构碰巧是32位,那么这会延长1从第31位到第9位,这是一个负数,所以你的192将是其他的东西,甚至不接近192.
总之,通过使用最终掩码0xff
我们确保没有什么比0将在9到31或63(x64)的位中。
顺便说一句,这样做的结果应该是:
ip address: 192.168.0.1
Program ended with exit code: 0
持续,请注意,编写的代码,因为它是可奇怪的是一些,不是每个人都想对付位,所以一可以通过简化我的初始解决方案更优雅的方法,检查了这一点:
#define UPPER32 24
#define UPPER16 16
#define UPPER8 8
#define IPADDRESS(a,b,c,d) (a << UPPER32 | b << UPPER16 | c << UPPER8 | d)
#define IPADDRESS_CLASS_A(ip) (((ip & 0xff000000) >> UPPER32) & 0xff)
#define IPADDRESS_CLASS_B(ip) ((ip & 0xff0000) >> UPPER16)
#define IPADDRESS_CLASS_C(ip) ((ip & 0xff00) >> UPPER8)
#define IPADDRESS_CLASS_D(ip) (ipaddr & 0xff)
#define IPADDRESS_FORMAT "%d.%d.%d.%d"
#define EXTRACT_IPADDR(ip) IPADDRESS_CLASS_A(ip), IPADDRESS_CLASS_B(ip), IPADDRESS_CLASS_C(ip), IPADDRESS_CLASS_D(ip)
int main(void)
{
int ipaddr = IPADDRESS(192,168,0,1); //192 168 000 001
printf("ip address: " IPADDRESS_FORMAT "\n", EXTRACT_IPADDR(ipaddr));
return 0;
}
干净的版本看起来更好的权利! 注意,参数a,b,c,d是指ip地址的网络类别(A,B,C,D类)。
问候。
UPDATE:
是完美的用户(程序员使用这个)不会有连关于IP地址的格式麻烦比他更应该,所以我加IPADDRESS_FORMAT宏包含字符串与常用的ip地址格式相同;)。
试试这个bit-shifting的方法来解析你的阵列到一个单一的内存位置。
uint8_t ip[4];
str = "192.168.1.1";
sscanf(str,"%hhu.%hhu.%hhu.%hhu",&ip[0],&ip[1],&ip[2],&ip[3]);
uint32_t ans = ip[0] << 24 + ip[1] << 16 + ip[2] << 8 + ip[3];
该格式是什么? '19216811'? – 2014-02-13 02:22:54
值应该等于** 0xc0a80101 **十六进制值 –
@siva我认为这就是我的解决方案会给你的......大声笑现在看到了这个,有趣的是,输出正是你想要的!很好的问题! –