我正在使用libpcap(gcc,linux),出于某种原因,我想从u_char packet[]
中提取数据包长度,将其保存为整数;说数据包长度存储在packet[38] packet[39]
中。类似的东西:
#include <stdio.h>
#include <netdb.h>
int main(int argc, char *argv[]) {
u_char packet[2] = {0xaa, 0xfc};
int length = 0xaafc; // how to do that ?
printf("%d\n", length);
}
到目前为止,我已经尝试过这个:
#include <stdio.h>
#include <stdlib.h>
#include <netdb.h>
int main(void)
{
u_char packet[2] = {0xaa, 0xfc};
int l = packet[0] | (packet[1]<<8);
printf("%d\n", l);
}
但没有成功!
那么如何在c中完成这个?如果我应该在这里发布整个代码,只需将其命名为......
感谢。
答案 0 :(得分:1)
在执行左移之前你应该投射到int
:
int l = packet[0] | (((int)packet[1])<<8);
如果没有这个演员表,packet[1]<<8
为0 - 你取8位变量并将其位移8次。你最终会得到8个零位。
答案 1 :(得分:0)
虽然您可以按照自己的方式进行操作,但将指针缓冲区转换为正确的类型要容易得多:
#include <linux/ip.h>
int main(void)
{
u_char *packet = ...;
int total_len;
int ip_hdr_len;
struct iphdr* iph;
struct tcphdr* tcph;
iph = (void*)packet;
// Remember fields are in network order!
// convert them to host order with ntoh[sl]
total_len = ntohs(iph->tot_len);
ip_hdr_len = iph->ihl * 4;
// Assuming TCP...
// Also be sure to check that packet is long enough!
tcph = (void*)(packet + ip_hdr_len);
}