首先要明白大端存储和小端存储的问题,windows系统使用小端存储,而网络传输中的数据采用的是大端存储。

关于大小端存储

网上流传的tcp头部的结构体是这样的

// TCP头部(20字节)
typedef struct _tcp_header
{unsigned short sport;              // 源端口号unsigned short   dport;              // 目的端口号unsigned int    seq_no;             // 序列号unsigned int  ack_no;             // 确认号
 unsigned char   thl:4;              // tcp头部长度unsigned char reserved_1:4;       // 保留6位中的4位首部长度unsigned char    reseverd_2:2;       // 保留6位中的2位unsigned char    flag:6;             // 6位标志 
 unsigned short  wnd_size;           // 16位窗口大小unsigned short    chk_sum;            // 16位TCP检验和unsigned short  urgt_p;             // 16为紧急指针
}tcp_header;

一开始,我也是使用这样的结构体进行数据分析,但是得到的结果总是和wireshark得到的结果相左。

后来我意识到这其中 thl 一直到 flag 这四个结构体成员是一起存储在一个unsigned short类型的数据中的。

unsigned short是小端存储的时候,在其中的顺序是这样的,而网络数据是大端存储方式,因此应该先将这四个变量整个进行一个大小端存储方式转换然后再取标志位的值。

后来我改用了这样的结构体

typedef struct _tcp_header
{
    unsigned short sport;              // 源端口号
    unsigned short dport;              // 目的端口号
    unsigned int   seq_no;             // 序列号
    unsigned int   ack_no;             // 确认号
    unsigned short  flag;               //16位标志
    unsigned short wnd_size;           // 16位窗口大小
    unsigned short chk_sum;            // 16位TCP检验和
    unsigned short urgt_p;             // 16为紧急指针
}tcp_header;

就是把4位首部长度、6位保留位和6位标志位一起作为一个unsigned short类型的flag,在处理的时候先将大端存储方式转换成小端存储方式,然后再按位取值就得到和wireshark相同的结果了。

c++解析tcp头部遇到的大小端转换问题相关推荐

  1. 来点基础的东西,关于浮点数的大小端转换以及浮点数的格式解析

    在网上并没有任何信息或则资料介绍关于浮点数的大小端转换的原理的问题,大小端是不同的内存存储实现方式,大端更符合人的阅读习惯,而小端则是更适合CPU读取. 我先说整型,来说明大小端在内存中的存储方式,整 ...

  2. c语言高低位拷贝_C语言中的大小端转换与高低位颠倒

    总结一下最近工作学到的东西,主要是关于大小端与高低位. 在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit ...

  3. C语言中的大小端转换与高低位颠倒

    在说大小端高低位之前,肯定要说明数据在计算机内是如何存储的.在计算机中,我们将数据分割成了一个一个的字节(byte),而每个字节又有8位(bit). 一个字节,可以声明为unsigned char型数 ...

  4. Java 大小端转换(基于ByteBuffer)

    大小端的基础知识: 小端 ( little-endian):低位字节在前,高位字节在后.大端(Big-Endian),则反之.具体而言,就是为了说清楚,CPU架构中1字(word)的存储顺序.计算机内 ...

  5. 使用函数实现数据大小端转换

    使用函数实现数据大小端转换 题目描述 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设计的层次,分别后续的修改. 请用函数实现一个4bit ...

  6. Verilog学习之数据大小端转换设计

    文章目录 前言 一.题目描述 二.实现思路 1.函数的概念 2.具体思路 三.代码展示 总结 前言 今天我们做的是第十道题--使用函数实现数据大小端转换,这道题其实也比较简单,就是逆向输出一个数据,但 ...

  7. Linux大小端转换实现

    实现 #include <byteswap.h> #include <stdint.h>/*** @brief 8字节类型的字节序转化*/ template<class ...

  8. java大小端转换工具类

    最近的项目频繁涉及大小端转换的情况,参考github(https://github.com/Frank-Wiebeler/java-Big2LittleEndian/blob/master/src/c ...

  9. 大小端转换 int16 和int32

    int16 大小端转换: static inline uint16_t bswap_16(uint16_t x) {     return (x >> 8) | (x << 8 ...

最新文章

  1. iis 无法连接mysql_远程无法连接SQL2000及MySQL的原因和解决办法
  2. python图案填充_向imshow Matplotlib添加图案填充
  3. Ubuntu 上 Node.js 安装和卸载
  4. 快速消费品行业前景及进入门槛
  5. 【数学基础】算法工程师必备的机器学习--线性模型(上)
  6. java如何忽略过程值_如果值为null,如何告诉Jackson在序列化期间忽略某个字段?...
  7. 作为一个对电脑配置一概不知的人,怎样才能一步一步了解电脑构造并且由此来学会怎样自己配置电脑?
  8. Nginx增加第三方外部插件
  9. EasyUI:easyUI中自定义icon
  10. 人脸检测用什么模型_人脸检测模型:使用哪个以及为什么使用?
  11. 专访《白话区块链》作者蒋勇:学习区块链空谈不如实践
  12. GNSS-GNSS原理-GNSS星座介绍
  13. netflix自动续费关闭_如何禁用Netflix的自动播放预览
  14. 3999 元起,小米 13 正式发布:骁龙 8 Gen 2、IP68、超窄边框直屏、徕卡三摄
  15. Hot Research Topics
  16. transitive dependencies (if any) will not be available, enable debug logging for more details
  17. 解决Android的WebView无法加载微信公众号链接中的图片和视频
  18. MySQL----数据库概述
  19. 关于制备螯合效应之冠醚修饰酚醛/硝酸铽/聚硫醚/苯并-18-冠醚-6的过程分享
  20. Https丢包分析及底层原理解析

热门文章

  1. PPT教程:码垛机器人及其操作应用
  2. 在gitcafe下用hexo建的新博客
  3. 从赛博朋克2077看未来互联网科技的发展
  4. 欧姆龙e5dc温控器_E5DC-QX2DSM-800手册欧姆龙 数字温度控制器E5DC-QX2DSM-800用户手册 - 广州凌控...
  5. php解析json转数组,php json转数组出错
  6. 二三四五再被监管点名:弹窗过多过频过大,上半年业绩下滑约七成
  7. 用python把视频分解成图片
  8. python通过Excel表格读取存储数据
  9. BetaFlight深入传感设计:传感模块设计框架
  10. Java jar命令打可执行的jar包