首页 > 其他分享 >Thrift 大小端传输剖析

Thrift 大小端传输剖析

时间:2023-05-23 19:31:36浏览次数:27  
标签:__ Thrift 剖析 传输 ENDIAN BYTE define ORDER THRIFT

说明

libthrift\src\thrift\protocol\TProtocol.h文件宏定义

__THRIFT_BYTE_ORDER定义了采样大端还是小端进行数据的传输

该宏定义通过包含include <boost/detail/endian.hpp>来决定当前系统的字节序


相关代码

#ifdef HAVE_SYS_PARAM_H
#include <sys/param.h>
#endif

#ifndef __THRIFT_BYTE_ORDER
# if defined(BYTE_ORDER) && defined(LITTLE_ENDIAN) && defined(BIG_ENDIAN)
#  define __THRIFT_BYTE_ORDER BYTE_ORDER
#  define __THRIFT_LITTLE_ENDIAN LITTLE_ENDIAN
#  define __THRIFT_BIG_ENDIAN BIG_ENDIAN
# else
#  include <boost/config.hpp>
#  include <boost/detail/endian.hpp>
#  define __THRIFT_BYTE_ORDER BOOST_BYTE_ORDER
#  ifdef BOOST_LITTLE_ENDIAN
#   define __THRIFT_LITTLE_ENDIAN __THRIFT_BYTE_ORDER
#   define __THRIFT_BIG_ENDIAN 0
#  else
#   define __THRIFT_LITTLE_ENDIAN 0
#   define __THRIFT_BIG_ENDIAN __THRIFT_BYTE_ORDER
#  endif
# endif
#endif

#if __THRIFT_BYTE_ORDER == __THRIFT_BIG_ENDIAN
#  define ntohll(n) (n)
#  define htonll(n) (n)
# if defined(__GNUC__) && defined(__GLIBC__)
#  include <byteswap.h>
#  define htolell(n) bswap_64(n)
#  define letohll(n) bswap_64(n)
# else /* GNUC & GLIBC */
#  define bswap_64(n) \
      ( (((n) & 0xff00000000000000ull) >> 56) \
      | (((n) & 0x00ff000000000000ull) >> 40) \
      | (((n) & 0x0000ff0000000000ull) >> 24) \
      | (((n) & 0x000000ff00000000ull) >> 8)  \
      | (((n) & 0x00000000ff000000ull) << 8)  \
      | (((n) & 0x0000000000ff0000ull) << 24) \
      | (((n) & 0x000000000000ff00ull) << 40) \
      | (((n) & 0x00000000000000ffull) << 56) )
#  define htolell(n) bswap_64(n)
#  define letohll(n) bswap_64(n)
# endif /* GNUC & GLIBC */
#elif __THRIFT_BYTE_ORDER == __THRIFT_LITTLE_ENDIAN
#  define htolell(n) (n)
#  define letohll(n) (n)
# if defined(__GNUC__) && defined(__GLIBC__)
#  include <byteswap.h>
#  define ntohll(n) bswap_64(n)
#  define htonll(n) bswap_64(n)
# elif defined(_MSC_VER) /* Microsoft Visual C++ */
#  define ntohll(n) ( _byteswap_uint64((uint64_t)n) )
#  define htonll(n) ( _byteswap_uint64((uint64_t)n) )
# else /* Not GNUC/GLIBC or MSVC */
#  define ntohll(n) ( (((uint64_t)ntohl(n)) << 32) + ntohl(n >> 32) )
#  define htonll(n) ( (((uint64_t)htonl(n)) << 32) + htonl(n >> 32) )
# endif /* GNUC/GLIBC or MSVC or something else */
#else /* __THRIFT_BYTE_ORDER */
# error "Can't define htonll or ntohll!"
#endif

标签:__,Thrift,剖析,传输,ENDIAN,BYTE,define,ORDER,THRIFT
From: https://blog.51cto.com/fengyuzaitu/6334150

相关文章

  • linux FTP文本传输
    目录一、文本传输协议二、连接方式三、程序安装四、黑名单和白名单五、实验1.实验一:匿名用户下载与上传2.实验二:关闭匿名用户登录,允许普通用户登录在家目录上传和下载3.实验三:禁止用户切换目录,只能在家目录操作4.实验四:黑名单限制test1登录   5.......
  • Thrift 消息序列化分析过程
    序列化浮点型数据流程 bitwise_cast<unsigned__int64,double>(doublefrom)行74 C++ apache::thrift::protocol::TBinaryProtocolT<apache::thrift::transport::TTransport>::writeDouble(constdoubledub)行171 C++ apache::thrift::protocol::TVirtualProtocol<......
  • 二:用电信号传输TCP/IP数据-3.2-ACK号的管理
    上一节讲了数据收发的大概过程,实际上网络的错误检测和补偿机制非常复杂,这一节讲三个关键点。一、返回ACK号的等待时间返回ACK号的等待时间叫超时时间。当网络传输繁忙时ACK号的返回会变慢,这时就要将等待时间设置得长一点,不然可能已经重传了,ACK号才到达。这样的重传是多余的,虽然......
  • rocky Elasticsearch 8.7.1集群 x-spack 安全验证 及 集群内部TLS加密传输 (ca)
    目录简介环境准备安装配置hostname解析安装systemd脚本ca证书配置给所有ES配置相同的用户密码启动查看 简介常规部署Elasticsearch集群时,不管是集群之间的数据传输,或者是Client访问Elasticsearch集群时均不需要相关验证,可通过对外提供的http接口,......
  • Graphql(五)Apollo 文件传输
    本文介绍如何在ApolloGraphQL中实现文件的传输文件传输在GrapqhQL中官方建议文章ApolloServerFileUploadBestPractices提及了实现文件上传的几种方式,分别是:SignedURLsUsinganimageuploadserviceMultipartUploadRequests本文介绍我所尝试过的第一种和第三种。......
  • Ext JS 4:模型剖析
          如果你在跟踪ExtJS动态,你可能已经知道,在ExtJS4中有一个全新的数据包。新的数据包在ExtJS3的基础上,增加了大良的新功能。近期我们在博客上介绍了新的数据包,今天我们将深度探讨新的Model类。     几乎每一个Model类就代表了应用程序中持久化的数据类型。例如......
  • 计算机网络--Ch5.传输层(三)
    六.流量控制流量控制:让发送方慢点,要让接收方来得及接收。TCP利用滑动窗口机制实现流量控制。A向B发送数据,连接建立时,B告诉A:“我的rwnd=400(字节)”,设每一个报文段100B,报文段序号初始值为1。TCP为每一个连接设有一个持续计时器,只要TCP连接的一方收到对方的零窗口通知,就启动......
  • WM_分库分表的深入实战剖析v1.0 一般有用 看1
    分库分表的深入实战剖析内容大纲分库分表概念电商系统下订单性能瓶颈问题分库分表原则剖析&产生的问题剖析电商系统亿级订单数据分库分表实战指导一、分库分表概念概念:在数据爆炸的年代,单表数据达到千万级别,甚至过亿的量,都是很常见的情景。这时候再对数据库进行操作就是......
  • RocketMQ 5.0 如何配置TLS加密传输?
    本文作者:李伟,社区里大家叫小伟,ApacheRocketMQCommitter,RocketMQPython客户端项目Owner,ApacheDorisContributor,腾讯云RocketMQ开发工程师。01传输架构图Namesrv:5.1.0Broker:5.1.0Dashboard:1.0.1-SNAPSHOT02准备Namesrv、Broker、Client的ca证书、密钥以下全部操作在......
  • Springboot支持XML格式报文的传输
    导入依赖-jackson-dataformat-xml<!--整合web模块--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><exclusions>......