二进制

聊聊序列化(一)关于序列化协议的一些思考和问题

半城伤御伤魂 提交于 2020-02-29 22:04:52
最近在设计一个RPC框架,需要处理序列化的问题。有很多种序列化协议可以选择,比如Java原生的序列化协议,Protobuf, Thrift, Hessian, Kryo等等,这里说的序列化协议专指Java的基于二进制的协议,不是基于XML, JSON这种格式的协议。在实际开发中考虑了很多点,也遇到一些问题,拿出来说说。 抛开这些协议不说,结合实际的需求,一个理想的序列化协议至少考虑4个方面: 1. 序列化后的字节数大小 2. 序列化和反序列化的效率 3. 是否支持被序列化对象新旧版本的兼容性问题。这个需求在实际开发中经常遇到,比如发布了一个服务,有很多客户端使用。当服务需要修改,新 添加1个参数时,不可能要求所有客户端都更新,那样牵扯的面太大,所以要做到新旧版本的兼容 4. 是否可以直接序列化对象,而不需要额外的辅助类,比如用IDL生成辅助的序列化类 前3个要求是衡量一个序列化协议好坏的重点,第4点是一个使用性的考虑,毕竟在不考虑跨平台调用的情况下,不需要使用IDL。使用IDL的开发方式一般是从IDL文件开始的,而不是直接从Java类开始。 序列化这件事说白了就是把一个对象变成一个二进制流,然后把二进制流再转化成对象的过程。前者好说,关键是后者,后者其实就是一个如何分帧(Frame)的问题,即从哪个字节开始读几个字节来还原成数据的问题。常见的分帧方式有: 1. 加结束符

算法分析:使用布隆过滤器(Bloom Filter)进行大数据量排序

半世苍凉 提交于 2020-02-29 21:53:27
题目大意:移动公司需要对已经发放的所有139段的号码进行统计排序,已经发放的139号码段的文件都存放在一个文本文件中(原题是放在两个文件中),一个号码一行,现在需要将文件里的所有号码进行排序,并写入到一个新的文件中;号码可能会有很多,最多可能有一亿个不同的号码(所有的139段号码),存入文本文件中大概要占1.2G的空间;JVM最大的内存在300以内,程序要考虑程序的可执行性及效率;只能使用Java标准库,不得使用第三方工具。 这是个典型的大数据量的排序算法问题,首先要考虑空间问题,一下把.2G的数据读入内存是不太可能的,就算把壹亿条数据都转换成INT类型存储也要占接近400M的空间。当时做个题目我并没有想太多的执行效率问题,主要就考虑了空间,而且习惯性的想到合并排序,基本思想是原文件分割成若干个小文件并排序,再将排序好的小文件合并得到最后结果,算法大概如下: 1、顺序读取存放号码文件的中所有号码,并取139之后的八位转换为int类型;每读取号码数满一百万个(这个数据可配置)将已经读取的号码排序并存入新建的临时文件。 2、将所有生成的号码有序的临时文件合并存入结果文件。 这个算法虽然解决了空间问题,但是运行效率极低,由于IO读写操作太多,加上步骤1中的排序的算法(快速排序)本来效率就不高(对于电话排序这种特殊情况来说),导致1亿条数据排序运行3个小时才有结果。

mysql之事务

早过忘川 提交于 2020-02-29 19:23:52
mysql事务简单来说就是数据库的数据进行一系列的操作。例如insert,delete等等,而这些语句组成的对数据库的操作就是事务。 mysql事务有4大特性ACID:原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。 原子性(Atomicity):一个事务的操作要不全部完成,要不全部不完成。不会结束在某个环节。事务会在发生错误时回滚(rollback)到事务前状态。 一致性(Consistency):在事务开始前和结束后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合数据库表预设的规则。包含资料精确度,串联型等等。 隔离性(Isolation):数据库允许多个并发事务同时对数据进行读取和修改的能力。隔离性可以防止多个事务并发执行时由于交叉执行导致数据的不一致。 持久性(Durability):事务在提交之后,其修改的数据将永久保留在数据库中。 事务控制 使用事务功能也只能是支持事务的引擎才可以。 启动:START TRANSACTION 或者begin 提交:COMMIT 回滚:ROLLBACK mysql默认的是自动提交功能,也就是说在使用insert,delete,update的时候,执行一条,提交一条。 如果操作取消的话,我们还将一条条的删除。事务就是解决这一问题

计算地址掩码

余生颓废 提交于 2020-02-29 17:19:41
子网掩码就是将某个 IP 地址划分成 网络地址 和 主机地址 两部分。 子网掩码——屏蔽一个 IP 地址 的网络部分的 “ 全 1” 比特模式。对于 A 类地址来说,默认的子网掩码是 255.0.0.0 ;对于 B 类地址来说默认的子网掩码是 255.255.0.0 ;对于 C 类地址来说默认的子网掩码是 255.255.255.0 。 子网掩码是一个 32 位地址,是与 IP 地址结合使用的一种技术。它的主要作用有两个, 一是用于屏蔽 IP 地址的一部分以区别 网络标识 和 主机 标识,并说明该 IP 地址是在 局域网 上,还是在远程网上。二是用于将一个大的 IP 网络划分为若干小的子网络。 使用子网是为了减少 IP 的浪费。因为随着 互联网 的发展,越来越多的网络产生,有的网络多则几百台,有的只有区区几台,这样就浪费了很多 IP 地址,所以要划分子网。使用子网可以提高网络应用的效率。 通过 IP 地址的 二进制 与子网掩码的二进制进行与运算,确定某个设备的 网络地址 和 主机 号,也就是说通过子网掩码分辨一个网络的网络部分和主机部分。子网掩码一旦设置, 网络地址 和 主机地址 就固定了。 通过计算机的子网掩码判断两台计算机是否属于同一网段的方法是,将计算机十进制的 IP 地址和子网掩码转换为二进制的形式,然后进行二进制 “ 与 ”(AND) 计算(全 1 则得 1 ,不全 1

加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较

末鹿安然 提交于 2020-02-29 17:15:20
转载自:http://www.cnblogs.com/sochishun/p/7028056.html 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 加密技术通常分为两大类:"对称式"和"非对称式"。 对称性加密算法: 对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。 非对称算法: 非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。 散列算法: 散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的"散列"或"消息摘要"(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。 对称性加密算法有

数学问题 | 十进制与二进制

孤街醉人 提交于 2020-02-29 15:57:04
题目描述: 对于一个十进制数A,将A转换为二进制数,然后按位逆序列排列,再转换为十进制数B,B即为A的二进制逆序数。例如,对于十进制数173,其二进制形式为10101101,逆序排列得到10110101,其十进制数为181,181即为173的二进制逆序数。 输入: 一个1000位(即10E999)以内的十进制数 输出: 输入的十进制数的二进制逆序数 测试样例: 输入: 173 输出: 181 C++代码: # include <iostream> # include <cstdio> # include <string> # include <vector> using namespace std ; string Divide ( string str , int x ) //字符串除法。 字符串 str 除以 x 后,返回所得字符串 { int remainder = 0 ; //保留余数 for ( int i = 0 ; i < str . size ( ) ; i ++ ) { int current = remainder * 10 + str [ i ] - '0' ; str [ i ] = current / x + '0' ; remainder = current % x ; } int pos = 0 ; while ( str [ pos ] == '0'

jmeter测试TCP服务器/模拟发送TCP请求 设置16进制发送(转)

China☆狼群 提交于 2020-02-29 12:02:33
转载留存:http://blog.sina.com.cn/s/blog_46d0362d0102v8ii.html 性能测试需要模拟多种场景,经常受制于资源限制,没办法建立贴近实际部署环境的场景。因而需要借助一些软硬件提供的特性来模拟近似的环境。本文提到的JMeter是一种开源的模拟测试解决方案,可以通过多线程并发的方式来持续提供压力测试源。 1.下载安装 仅仅需要从apache的网站找到下载包,解压到本地文件目录即可。 http://jmeter.apache.org/download_jmeter.cgi 2.启动 解压目录中存在一个bin的目录,里面有很多批处理文件和脚本文件,window系统运行jmeter.bat即可。需要关注的是bin目录中的jmeter.properties文件,这是运行相关的配置文件. 特别是TCP Sampler configuration部分几个配置会和后面内容相关 3.建立一种类型测试 这里只描述简单的tcp测试建立步骤,因为目前支持的测试类型很多,无法一一陈述,功能细节部分可以参考JMeter文档 1)创建测试线程组 2)根据需要设定线程组参数 3)建立TCP采样 3)配置TCP采样参数 基本上一个简单的测试计划就完成了,点击运行采样,就会将文本发送出去。 4.高级功能配置 1)配置结果查看监听器 有时候需要查看线程组执行结果情况

普通位运算

感情迁移 提交于 2020-02-29 03:01:23
#include <stdio.h> int main(void) { //定义一个无符号字符型变量,此变量只能用来存储无符号数 unsigned char result; int a,b,c,d; a = 2; b = 4; c = 6; d = 8; //对变量进行“按位与”操作 result = a & c; printf("result = %d\n",result ); //2 //对变量进行“按位或”操作 result = b | d; printf("result = %d\n",result ); //12 //对变量进行“按位异或”操作 result = a ^ d; printf("result = %d\n",result ); //10 //对变量进行“取反”操作 result = ~a; printf("result = %d\n",result ); //253 } /** 按位与(&)运算符:参加运算的两个运算符,如果都为1,则该位为1,否则为0 按位或(|)运算符:两个相应位中只要有一个为1,则该位的结果为1. 按位异或(^)运算符:参加运算的两个相应位,同号则结果为0(假),异号则结果为1(真) 取反(~)运算符:他是一个单目(元)运算符,用来对一个二进制数按位取反,即将0变为1,1变为0。 注意点: --位运算符是对二进制按位进行运算

位运算

妖精的绣舞 提交于 2020-02-29 00:47:03
首先 要明白位运算是在二进制中的运算方式,所有其他进制的数在进行位运算时都要先转化成二进制数再进行运算。 位运算主要包括按位与(&)、按位或(|)、按位异或(^)、取反( ~ )、左移(<<)、右移(>>)这几种。 其中除了取反( ~ )以外,其他的都是二目运算符,即要求运算符左右两侧均有一个运算量。 补码 补码是为了表示一个负数的二进制形式。 其转化方式是,先将负数当成正数,转化成二进制的形式,再将二进制正数的各个位上取反,再加上一。 例如-5 先求出5的二进制数 : 0000 0000 0101 然后将各个位上0变1,1变0 : 1111 1111 1010 最后再加1 : 1111 1111 1011 按位与(&) 运算的两个数,转换算为二进制后,进行与(&)运算。 当相应位上的数都是1时,该位取1,否则该为0。 例如5 & -5 5 : 0000 0000 0101 -5 :1111 1111 1011 答案 : 0000 0000 0001 按位或(|) 运算的两个数,转换为二进制后,进行或(|)运算。 只要相应位上存在1,那么该位就取1,如果都不为1,就为0。 还是5 | -5 0000 0000 0101 1111 1111 1011 可以看到每一位中其中一个都有1 答案 :1111 1111 1111 按位异或(^) 运算的两个数,转换成二进制数后,进行异或(^

linux文件IO

ぐ巨炮叔叔 提交于 2020-02-28 23:18:47
文件类型: 常规文件 r:文本文件,二进制文件(比如一些程序) 目录文件 d:文件夹下放的所有文件的名称,以及里面的一些信息,就放在目录文件中 字符设备文件 c:linux中将设备看成一个文件,每个文件代表一种设备,访问设备,也就是访问设备文件 块设备文件 b: 管道文件 p:这是进程间通讯的一种机制 套接字文件 s:也是通讯的一种机制 符号链接文件 l:类似windows的快捷方式文件 标准IO: 标准IO由ANSI C标准定义,就是c库定义好的一些文件输入输出的函数。有c库,我们就能使用标准IO,主流操作系统上都实现了c库。 FILE: 其实就是流,是一个结构体结构体,这个结构体存放打开的文件的相关信息 流有两种,一种是文本流,一种是二进制流。 windows中二进制流:换行符是'\n',而文本流是'\r''\n' linux不区分文本流和二进制流,对于换行符来说,都是'\n' 流的缓冲类型: 全缓冲:当流的缓冲区无数据,或者无空间时才执行的实际IO操作 行缓冲:当输入输出遇到换行符时,进行实际IO操作。当流和一个终端关联时,是典型的行缓冲。 无缓冲:数据直接写入文件,流不进行缓冲。 实际操作: 打开流的函数: FILE * fopen (const char *path,const char*mode); //第一个参数是文件路径,第二个是打开方式具体如下表 成功时返回流指针