C:使用sprintf()进行IP地址解析,值不正确

时间:2015-07-29 15:33:48

标签: c parsing printf

我试图使用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。他们不正确。谁知道这个?是因为说明符吗?

2 个答案:

答案 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为二进制11111111Two'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)