我有一个* 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);
}
}
答案 0 :(得分:1)
1)
while(p) {
应该是
while(*p) {
2)对于
asprintf(&hexValue,"%s%02x",hexValue,p);
我不确定asprinf是否支持在输入参数中传递hexValue
两次,但我建议使用另一个变量来确信tere不会发生意外:
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);
<强>阐释:强>
charachter代码以2个十六进制数字表示。正如您在asprintf格式说明符"%02X"
中所做的那样。因此,对于p中的每个元素,您需要在每个p元素的十六进制代码中写入2个char。这就是为什么hexValue的长度= 2 * p的长度。我添加了1,因为这将用于null终结符charachter。
关于
for (;*p;q+=2,p++)
sprintf(q,"%02X",*p);
q
最初指向hexadecimal
,并且对于每个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);
}