c - 将数组读入字符串的最快方法

标签 c arrays

我有一个 *p 代表下面的数组,这就是我现在阅读它的方式。我需要最快的方法来读取它并存储到 C 中的字符串变量中。请问有什么建议吗?

char *hexValue="";
while(p) {
    printf("\n\nstr: %s\n", p);
    asprintf(&hexValue,"%s%02x",hexValue,p);
    p++;
}

以下是全部功能代码。

void dummyProcesssPacket(const struct pfring_pkthdr *h, 
             const u_char *p, const u_char *user_bytes) {
  long threadId = (long)user_bytes;
  printf("\nIN Dummy\n");
  numPkts[threadId]++, numBytes[threadId] += h->len+24 /* 8 Preamble + 4 CRC + 12 IFG */;

#ifdef ENABLE_BPF
  if (userspace_bpf && bpf_filter(filter.bf_insns, p, h->caplen, h->len) == 0)
    return; /* rejected */

  numPktsFiltered[threadId]++;
#endif

  if(touch_payload) {
    volatile int __attribute__ ((unused)) i;

    i = p[12] + p[13];
  }

  if(verbose) {
    printf("\nverbose :");
    struct ether_header *ehdr;
    char buf1[32], buf2[32];
    struct ip *ip;
    int s;
    uint usec;
    uint nsec=0;


    int i=0;
    int j=0,line=0,packSize=h->caplen;
    char *hexValue="";
    while(j<packSize/16)
    {
      printf("%06x: ",line++);
        for(i=0;i<16;i++)
        {
          printf("%02x ",p[j*16+i]);
          asprintf(&hexValue,"%s%02x",hexValue,p[j*16+i]);
        }
        printf("   |");
        /*for(i=0;i<16;i++)
        {
           if(isprint(p[j*16+i]))
             printf("%c",p[j*16+i]);
           else
             printf(".");
        }*/
        printf("|\n");
        j++;
    }
    printf("\nTotal hex value is %s",hexValue);




    if(h->ts.tv_sec == 0) {
      memset((void*)&h->extended_hdr.parsed_pkt, 0, sizeof(struct pkt_parsing_info));
      pfring_parse_pkt((u_char*)p, (struct pfring_pkthdr*)h, 5, 1, 1);
    }

    s = (h->ts.tv_sec + thiszone) % 86400;

    if(h->extended_hdr.timestamp_ns) {
      if (pd->dna.dna_dev.mem_info.device_model != intel_igb_82580 /* other than intel_igb_82580 */)
        s = ((h->extended_hdr.timestamp_ns / 1000000000) + thiszone) % 86400;
      /* "else" intel_igb_82580 has 40 bit ts, using gettimeofday seconds:
       * be careful with drifts mixing sys time and hw timestamp */
      usec = (h->extended_hdr.timestamp_ns / 1000) % 1000000;
      nsec = h->extended_hdr.timestamp_ns % 1000;
    } else {
      usec = h->ts.tv_usec;
    }

    printf("%02d:%02d:%02d.%06u%03u ",
       s / 3600, (s % 3600) / 60, s % 60,
       usec, nsec);

    ehdr = (struct ether_header *) p;
    printf("\n\nBefore Extexted :%d",use_extended_pkt_header);
    if(use_extended_pkt_header) {
      printf("\nafter USE EXE");
      printf("%s[if_index=%d]",
        h->extended_hdr.rx_direction ? "[RX]" : "[TX]",
        h->extended_hdr.if_index);

      printf("[%s -> %s] ",
         etheraddr_string(h->extended_hdr.parsed_pkt.smac, buf1),
         etheraddr_string(h->extended_hdr.parsed_pkt.dmac, buf2));    

      if(h->extended_hdr.parsed_pkt.offset.vlan_offset)
    printf("[vlan %u] ", h->extended_hdr.parsed_pkt.vlan_id);

      if (h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ || h->extended_hdr.parsed_pkt.eth_type == 0x86DD /* IPv6*/) {

        if(h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ ) {
      printf("[IPv4][%s:%d ", intoa(h->extended_hdr.parsed_pkt.ipv4_src), h->extended_hdr.parsed_pkt.l4_src_port);
      printf("-> %s:%d] ", intoa(h->extended_hdr.parsed_pkt.ipv4_dst), h->extended_hdr.parsed_pkt.l4_dst_port);




                    char sql_lite[1500];
                    int lastID = mysql_insert_id(conn);
                    printf("\n\n\nLAT IS %d",lastID);
                    char *hexValue="";
                    while(p) {
                  printf("\n\nstr: %s\n", p);
                  asprintf(&hexValue,"%s%02x",hexValue,p);
                  p++;
               }
                    //printf("\n\n char size : p size %lu ",sizeof(p));
                    sprintf(sql_lite, "insert into tblPL1 values ('%d','%s','%s')",'2013-05-11 20:20:20',p[0]);
              puts(sql_lite);
              //error = sqlite3_exec(conn, sql_lite, 0, 0, 0);




        } else {
          printf("[IPv6][%s:%d ",    in6toa(h->extended_hdr.parsed_pkt.ipv6_src), h->extended_hdr.parsed_pkt.l4_src_port);
          printf("-> %s:%d] ", in6toa(h->extended_hdr.parsed_pkt.ipv6_dst), h->extended_hdr.parsed_pkt.l4_dst_port);
        }

    printf("[l3_proto=%s]", proto2str(h->extended_hdr.parsed_pkt.l3_proto));

    if(h->extended_hdr.parsed_pkt.tunnel.tunnel_id != NO_TUNNEL_ID) {
      printf("[TEID=0x%08X][tunneled_proto=%s]", 
         h->extended_hdr.parsed_pkt.tunnel.tunnel_id,
         proto2str(h->extended_hdr.parsed_pkt.tunnel.tunneled_proto));

      if(h->extended_hdr.parsed_pkt.eth_type == 0x0800 /* IPv4*/ ) {
        printf("[IPv4][%s:%d ",
           intoa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_src.v4),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_src_port);
        printf("-> %s:%d] ", 
           intoa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_dst.v4),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_dst_port);
      } else {
        printf("[IPv6][%s:%d ", 
           in6toa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_src.v6),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_src_port);
        printf("-> %s:%d] ",
           in6toa(h->extended_hdr.parsed_pkt.tunnel.tunneled_ip_dst.v6),
           h->extended_hdr.parsed_pkt.tunnel.tunneled_l4_dst_port);
      }   
    }

    printf("[hash=%u][tos=%d][tcp_seq_num=%u]",
      h->extended_hdr.pkt_hash,
          h->extended_hdr.parsed_pkt.ipv4_tos, 
      h->extended_hdr.parsed_pkt.tcp.seq_num);

      } else {
    if(h->extended_hdr.parsed_pkt.eth_type == 0x0806 /* ARP */)
      printf("[ARP]");
    else
      printf("[eth_type=0x%04X]", h->extended_hdr.parsed_pkt.eth_type);
      }

      printf(" [caplen=%d][len=%d][parsed_header_len=%d][eth_offset=%d][l3_offset=%d][l4_offset=%d][payload_offset=%d]\n",
        h->caplen, h->len, h->extended_hdr.parsed_header_len,
        h->extended_hdr.parsed_pkt.offset.eth_offset,
        h->extended_hdr.parsed_pkt.offset.l3_offset,
        h->extended_hdr.parsed_pkt.offset.l4_offset,
        h->extended_hdr.parsed_pkt.offset.payload_offset);

    } else {
      printf("[%s -> %s][eth_type=0x%04X][caplen=%d][len=%d] (use -m for details)\n",
         etheraddr_string(ehdr->ether_shost, buf1),
         etheraddr_string(ehdr->ether_dhost, buf2), 
         ntohs(ehdr->ether_type),
         h->caplen, h->len);
    }
  }

  if(verbose == 2) {
      int i;

      for(i = 0; i < h->caplen; i++)
        printf("%02X ", p[i]);
      printf("\n");
  }

  if(unlikely(add_drop_rule)) {
    if(h->ts.tv_sec == 0)
      pfring_parse_pkt((u_char*)p, (struct pfring_pkthdr*)h, 4, 0, 1);

    drop_packet_rule(h);
  }
}

最佳答案

1) 对于

while(p) {

应该是

while(*p) {

2)对于

asprintf(&hexValue,"%s%02x",hexValue,p);

我不确定 asprinf 是否支持在输入参数中传递 hexValue 两次,但我建议使用另一个变量来确保发生这种情况并不奇怪:

3)你可以改变

char *hexValue="";
while(p) {
    printf("\n\nstr: %s\n", p);
    asprintf(&hexValue,"%s%02x",hexValue,p);
    p++;
}

char *hexValue=malloc(((h->caplen)*2)+1);
char *q=hexValue;
int i;
for (i=0;i<h->caplen;q+=2,i++)
       sprintf(q,"%02X",*(p+i));
printf("%s\n", hexValue);

说明: 字符代码以 2 个十六进制数字表示。正如您在 asprintf 格式说明符 "%02X" 中所做的那样。因此,对于 p 中的每个元素,您需要 2 个字符来写入每个 p 元素的十六进制代码。这就是为什么 hexValue 的长度 = 2 * p 的长度。我添加了 1,因为这将用于空终止符字符。

关于

for (;*p;q+=2,p++)
    sprintf(q,"%02X",*p);

q 最初指向十六进制,并且对于每个 for 迭代,q 都会增加 2 q+=2因为你必须用 2 个字符编写代码。

编辑根据段错误 我尝试在一个小程序中运行代码并且它可以工作。在单独的程序中尝试以下代码,看看是否存在段错误

int main()

{

    const unsigned char pp[] = {'a','b','c','d'};
    const unsigned char *p = pp;
    int caplen = 4;
    char *hexValue=malloc(((caplen)*2)+1);
    char *q=hexValue;
    int i;
    for (i=0;i<caplen;q+=2,i++)
           sprintf(q,"%02X",*(p+i));
    printf("%s\n", hexValue);

}

关于c - 将数组读入字符串的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16592365/

相关文章:

c++ - clans 自定义 int 大小功能是否会添加到 gcc 中?

c - 函数 strcpy() 更改整数数组的值?

arrays - 从数组中获取一定数量的随机项

javascript - 拆分对象数组,以处理数据点

javascript - 简单的 ng-Repeat 用于选择框的选项

java - 如何比较Java中的两个对象数组?

java - 如何修复: Net Beans Can't Find 3D Array

c - 我如何修改线程以打印 "hello world again"?在C中

c++ - 在 C/C++ 代码中查找指针是否静态等同于停止问题?

c - 指针数组初始化