gpt4 book ai didi

c - 需要将字符串值存储到 int 而不是 4 字节大小的 char 数组中

转载 作者:太空宇宙 更新时间:2023-11-03 23:28:17 25 4
gpt4 key购买 nike

我正在将 ip 地址 值存储到一个大小为 4 字节的 char array(uint8_t) 中,而不是我需要将该值存储到一个 单个整数,怎么做

    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) 数组

最佳答案

即使您的问题已经得到解答,我也非常喜欢您的问题,所以我决定解决它并为您实现解决方案。希望这能解决您的问题:

/**
* 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 的最终掩码,我们确保在 9 到 31 或 63 (x64) 范围内的位中不会超过 0。

顺便说一下,这个输出将是:

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 地址的网络类别 (Class A, B, C, D)。

问候。

更新:

为了完美,用户(使用它的程序员)甚至不必为 ip 地址的格式操心,所以,我添加了 IPADDRESS_FORMAT 宏,其中包含具有通用 ip 地址格式的字符串文字;) .

关于c - 需要将字符串值存储到 int 而不是 4 字节大小的 char 数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21743935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com