在网络传输中,很多数据都是按字节传递而不是字符串。最近就遇到了这个问题,在刚开始学c语言时都没有问题,可能太久不用了,记录一下

在报中文,用2个字节hex码来表示报文正文长度,什么是hex码呢 就是16进制数

char c = ‘\b’;

那么c的整数类型就是8(ascii 8对应\b)

char类型是可以直接转int的 我犯得错误就是用atoi来转整形,aoti转的是字符串类型到整形 比如"123"转为123,而如果"b"用atoi 则转出来的为0

而如果网络报文中用两个字节来表示长度的话,可以用

char *c=....

*(short*)(c);

四字节用

*(int*((c);

单个字节就直接找到长度的那位字符 如*(int*)(c[10])

2019/5/29

在解析报文长度的字节时,直接把报文中代表长度的两个字节拷到 数组中 char c[2];c[1]为'0',c[2]为8'\b',在这里我直接用*((short*)(c)) 来把字节转为数字。期望的结果是8,却得出了2048.。。

这里就要从大小端开始说。数组 c在内存中的分布是 00 08,而inter x86 是小端机,short类型为两个字节,读出来的字节序就为0800了,这就是原因。 需要转换一下字节序即可。

下面是几个转换的方法

对于字数据(16位):
#define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8) | \
(( (uint16)(A) & 0x00ff) << 8))

对于双字数据(32位):

#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000) >> 24) | \
(( (uint32)(A) & 0x00ff0000) >> 8) | \
(( (uint32)(A) & 0x0000ff00) << 8) | \
(( (uint32)(A) & 0x000000ff) << 24))

延伸出来的问题是,为什么数组没有大小端这一说法呢? 猜测应该是数组内存经过管理不用大小端转换

2019/6/12 更新 浮点数也没有大小端之分,其内存结构应该遵循IEEE制定的规范。

下面为一篇浮点数在内存中分布的讲解

http://www.ruanyifeng.com/blog/2010/06/ieee_floating-point_representation.html

2019/6/13更新  今天又被现实上了一课。。。

发现报文中传输的数据,是这样子的

这是wireshark抓的包,里面是hex即16进制字符,对方给的数据在16进制下显示为19060310,而实际的十进制下也是19060310。。。这种写法真是挺少见的

处理的方法只能一个字节一个字节处理了,先处理每个字节的高4位,保存一下,再处理低四位(每个16进制的高低四位分开看其实就等于它的十进制数据,说不太明白。。。) 查了一下 就是 hex转string

    char str_hex[] = "\x19";
char pp = str_hex[] >> ;
char pppp = str_hex[] & 0x0F;
char endppp = pp * + pppp;

思考了一下 发现这种写法可以节约空间提升传输效率,如果12这个数字通过转换成字符串的类型发送,则要耗费2个字节,而如果转换为16进制字节的表示形式,只需要一个字节即可。缺点就是转换繁琐,容易出错

#include <iostream>
#include <stream>
#include <sstream>

//deep为s长度减1

//2019/6/27更新 修改将无符号字节解析为有符号数从而出现负数的情况
static int hex2d(string s, int deep)
{
if (s.empty())
return 0;
//每次只解析一个字节
unsigned char high4 = (s[0] >> 4) &0x0F;
unsigned  char low4 = s[0] & 0x0F;
unsigned char ch_ret = high4 * 10 + low4;
int n = 0;
n = pow(100, deep);
return ch_ret*n + hex2d(s.substr(1), deep - 1);
}

使用方法 hex2d(str,str.size()-1)

另一种方法

https://blog.csdn.net/sunflover454/article/details/51219472

c++字符和字符串转整数类型及大小端的更多相关文章

  1. 005 python 整数类型/字符串类型/列表类型/可变/不可变

    可变/不可变类型 可变类型 ID不变的情况下,值改变,则称之为可变类型,如列表,字典 不可变类型 值改变,ID改变,则称之为不可变类型,如 整数 字符串,元组 整数类型 int 正整数 用途就是记录年 ...

  2. shell编程系列4--有类型变量:字符串、只读类型、整数、数组

    shell编程系列4--有类型变量:字符串.只读类型.整数.数组 有类型变量总结: declare命令和typeset命令两者等价 declare.typeset命令都是用来定义变量类型的 decla ...

  3. 第二章 Mysql 数据类型简介--(整数类型、浮点数类型和定点数类型,日期与时间类型,字符串类型,二进制类型)

    第一节:整数类型.浮点数类型和定点数类型 1,整数类型 2,浮点数类型和定点数类型 M 表示:数据的总长度(不包括小数点):D 表示:小数位:例如 decimal(5,2) 123.45存入数据的时候 ...

  4. java标签(label)求16进制字符串的整数和 把一个整数转为4个16进制字符表示

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #4f76cb } p.p2 { margin: 0.0px 0. ...

  5. [c/c++] programming之路(24)、字符串(五)——字符串插入,字符串转整数,删除字符,密码验证,注意事项

    1.将字符串插入到某位置(原字符串“hello yincheng hello cpp hello linux”,查找cpp,找到后在cpp的后面插入字符串“hello c”) 需要用到strstr字符 ...

  6. 字符、字符串和文本的处理之String类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

  7. 字符、字符串和文本的处理之Char类型

    .Net Framework中处理字符和字符串的主要有以下这么几个类: (1).System.Char类 一基础字符串处理类 (2).System.String类 一处理不可变的字符串(一经创建,字符 ...

  8. go语言基础之字符串类型 和 字符与字符串类型的区别

    1.字符串类型 示例1: package main //必须有一个main包 import "fmt" func main() { var str1 string str1 = & ...

  9. Core Java 总结(字符和字符串类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 字符,字符串类问题 正则表达式问题 J ...

随机推荐

  1. 修改Mysql 数据库的密码

    1.修改my.cnf 在这个文件里面加入 skip-grant-tables 修改之后,保存.然后重启数据库 2.由于我的系统是Centos7 ,数据库是mariadb ,所以执行命令如下: 3.重启 ...

  2. nginx负载均衡高可用部署和代理配置

    nginx负载均衡高可用配置 服务器A:172.16.100.2 服务器B:172.16.100.3 首先先在两台服务器上分别安装好nginx和keepalived后,再进行下面的操作 配置keepa ...

  3. 【FFMPEG】ffmpeg 时间戳问题汇总

    ffmpeg 时间戳问题汇总 http://www.cnblogs.com/loveclover/archive/2011/03/23/1993065.html 问题是这样的 用一个 VLC(流媒体客 ...

  4. Kafka性能调优分析-线上环境篇

    一.背景介绍: 在平时的开发中,使用kafka来发送数据已经非常熟悉,但是在使用的过程中,其实并没有比较深入的探索kafka使用过程中 一些参数配置,带来的损失可能就是没有充分的发挥出kfka的优势, ...

  5. [loj#539][LibreOJ NOIP Round #1]旅游路线_倍增_dp

    「LibreOJ NOIP Round #1」旅游路线 题目链接:https://loj.ac/problem/539 题解: 这个题就很神奇 首先大力$dp$很好想,因为可以把一维放到状态里以取消后 ...

  6. [转帖]@RequestMapping 用法详解之地址映射(转)

    @RequestMapping 用法详解之地址映射(转) https://www.cnblogs.com/qq78292959/p/3760560.html 从csdn 发现的文章 然后csdn指向c ...

  7. 大数据备忘录———将数据从oracle导入impala中

    上周遇到了将数据从oracle导入到impala的问题,这个项目耽误了我近一周的时间,虽然是种种原因导致的,但是还是做个总结. 需求首先是跑数据,跑数据这个就不叙述,用的是公司的平台. 讲讲耽误我最久 ...

  8. [LGP4707] 重返现世

    世界是物质的,物质是运动的,运动是有规律的,规律是可以被认识的. 关于期望意义下min-max容斥,我们认为每个事件的时间来认识事件,max/min S表示集合S中所有时间最后/最前出现的事件,E(m ...

  9. Treasure Island(两遍dfs)-- Codeforces Round #583 (Div. 1 + Div. 2, based on Olympiad of Metropolises)

    题意:https://codeforc.es/contest/1214/problem/D 给你一个n*m的图,每次可以往右或者往下走,问你使(1,1)不能到(n,m)最少要放多少 ‘ # ’ . 思 ...

  10. Firebase Chat (firebase 实现web聊天室)

    基于firebase + cloud Function 实现web聊天(demo版) 知识点: 使用Firebase SDK创建Google Cloud功能. 触发云功能基于Auth,云存储和Clou ...