我试图使用sprintf()
来解析IP地址。 buf
存储从其他主机收到的数据包。 buf
中的测试数据为'\0xff'
。我希望在255.255.255.255
中看到ip
。但我得到的是-1.-1.-1.-1
中的ip
。
char buf[5];
char ip[18];
...
// They all have value 0xff, that is buf[0]=buf[1]=buf[2]=buf[3]='\0xff';
sprintf(ip, "'%d.%d.%d.%d'",buf[0],buf[1],buf[2],buf[3]);
似乎buf
中的每个字节都加一个。我认为它应该与说明符有关,也许我应该使用unsigned int
的说明符。然后我尝试了%u
,%hhd
。他们不正确。谁知道这个?是因为说明符吗?
答案 0 :(得分:3)
这并没有真正回答这个问题,因为GrahamS已经很好地回答了这个问题,但你可能想尝试使用为此类事件制作的TCP / IP堆栈的函数和结构:
#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/in.h>
int main()
{
/*
* Using functions and structs that were made for this
*/
//this is really just a one-member struct with a uint_32t
struct in_addr addr;
//Convert Presenteation to Number (pton) for the AF_INET address family (IPv4)
inet_pton(AF_INET,"1.2.3.4",&addr);
//INET_ADDRSTRLEN -- how much space is needed to hold the presentation of an IP4 ip addresss?
//defined to 16 -- enough to hold 255.255.255.255 with the null terminator
char buf[INET_ADDRSTRLEN];
//convert back to string
inet_ntop(AF_INET,&addr, buf, sizeof(buf));
puts(buf);
return 0;
}
答案 1 :(得分:2)
您已将buf
声明为signed char
您看到-1
,因为0xFF
为二进制11111111
,Two's Complement中为-1
将buf
声明为unsigned char,如下所示:
#include <stdio.h>
int main(void)
{
unsigned char buf[4] = { 0xFF, 0xEE, 0xDD, 0xFF };
char ip[18];
sprintf(ip, "%d.%d.%d.%d", buf[0], buf[1], buf[2], buf[3]);
printf (ip);
return 0;
}
根据您的目标平台,您可能希望查看为您执行所有这些操作的库。例如inet_ntoa(3)