js_long.php,protobuf.js 与 Long.js的使用详解

这次给大家带来protobuf.js 与 Long.js的使用详解,是急用protobuf.js 与 Long.js的注意事项有哪些,下面就是实战案例,一起来看一下。

protobuf.js的结构和webpack的加载之后的结构很相似。这样的模块化组合是个不错的结构方式。1个是适应了不同的加载方式,2个模块直接很独立。webpack的功能更全一点。但如果自己封装js库这样够用了。而且模块对外统一接口 module.exports。这和node很像。(function(global, undefined) { "use strict";

(function prelude(modules, cache, entries) { function $require(name) { var $module = cache[name]; //没有就去加载

if (!$module)

modules[name][0].call($module = cache[name] = { exports: {} }, $require, $module, $module.exports); return $module.exports;

} //曝光成全局

var proto = global.proto = $require(entries[0]); // AMD

if (typeof define === "function" && define.amd) {

define(["long"], function(Long) { if (Long && Long.isLong) {

proto.util.Long = Long;

proto.configure();

}

}); return proto;

} //CommonJS

if (typeof module === "object" && module && module.exports)

module.exports = proto;

}) //传参 ({ 1: [function (require, module, exports) { function first() {

console.log("first");

}

module.exports = first;

}, {}], 2: [function(require, module, exports) { function second() {

console.log("second");

}

module.exports = second;

}], 3: [function (require, module, exports) { var proto = {};

proto.first = require(1);

proto.second = require(2);

proto.build = "full";

module.exports = proto;

}]

}, {}, [3]);

})(typeof window==="object"&&window||typeof self==="object"&&self||this)

在处理超过16位的整形就得使用Long.js了。 主要是fromString和toString。function fromString(str, unsigned, radix) { if (str.length === 0) throw Error('empty string'); if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity") return ZERO; if (typeof unsigned === 'number') { // For goog.math.long compatibility

radix = unsigned,

unsigned = false;

} else {

unsigned = !!unsigned;

}

radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError('radix'); var p; if ((p = str.indexOf('-')) > 0) throw Error('interior hyphen'); else if (p === 0) { return fromString(str.substring(1), unsigned, radix).neg();

} // Do several (8) digits each time through the loop, so as to

// minimize the calls to the very expensive emulated p.

var radixToPower = fromNumber(pow_dbl(radix, 8)); var result = ZERO; for (var i = 0; i < str.length; i += 8) { var size = Math.min(8, str.length - i), value = parseInt(str.substring(i, i + size), radix); if (size < 8) { var power = fromNumber(pow_dbl(radix, size));

result = result.mul(power).add(fromNumber(value));

} else { result = result.mul(radixToPower);

result = result.add(fromNumber(value));

}

}

result.unsigned = unsigned; return result;

}

fromstring的思路是把字符串8位一个截取。然后转成Long型(高位,地位,符号位) 加起来。最后是一个Long型。 4294967296 是2的32次方。每次操作之前都会有一个基数的操作 mul(radixToPower)或者mul(power)这两者都是保证result的位数是正确的。

比如{low:123} 和{low:1} 相加之前,先要让{low:123}乘以10,得到{low:1230}再与{low:1}进行位操作。因为第一个是高位,不能直接相加。

7e117a23052f1438292eb6516ca3245a.pngfunction fromBits(lowBits, highBits, unsigned) { return new Long(lowBits, highBits, unsigned);

}

fromBits 即转为Long对象。value%4294967296 得到低位。/得到高位。结果通过位移合并起来。mul是bit的乘法,add是bit的加法。 原理是讲一个64位的拆成四段。分别16位。this.low左移16位 就得到 low的32-17位是啥。 然后和addend对象的同位相加

最后的合并是通过|运算。位移之后再还原确实很巧妙。一时看上去都不大理解。LongPrototype.add = function add(addend) { if (!isLong(addend))

addend = fromValue(addend); // pide each number into 4 chunks of 16 bits, and then sum the chunks.

var a48 = this.high >>> 16; var a32 = this.high & 0xFFFF; var a16 = this.low >>> 16; var a00 = this.low & 0xFFFF; var b48 = addend.high >>> 16; var b32 = addend.high & 0xFFFF; var b16 = addend.low >>> 16; var b00 = addend.low & 0xFFFF; var c48 = 0, c32 = 0, c16 = 0, c00 = 0;

c00 += a00 + b00;

c16 += c00 >>> 16;

c00 &= 0xFFFF;

c16 += a16 + b16;

c32 += c16 >>> 16;

c16 &= 0xFFFF;

c32 += a32 + b32;

c48 += c32 >>> 16;

c32 &= 0xFFFF;

c48 += a48 + b48;

c48 &= 0xFFFF; return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);

};

>>>和>>有什么区别??。

toStringLongPrototype.toString = function toString(radix) {

radix = radix || 10; if (radix < 2 || 36 < radix) throw RangeError('radix'); if (this.isZero()) return '0'; if (this.isNegative()) { // Unsigned Longs are never negative

if (this.eq(MIN_VALUE)) { // We need to change the Long value before it can be negated, so we remove

// the bottom-most digit in this base and then recurse to do the rest.

var radixLong = fromNumber(radix),

p = this.p(radixLong),

rem1 = p.mul(radixLong).sub(this); return p.toString(radix) + rem1.toInt().toString(radix);

} else

return '-' + this.neg().toString(radix);

} // Do several (6) digits each time through the loop, so as to

// minimize the calls to the very expensive emulated p.

var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),

rem = this; var result = ''; while (true) { var remp = rem.p(radixToPower),

intval = rem.sub(remp.mul(radixToPower)).toInt() >>> 0,

digits = intval.toString(radix);

rem = remp; if (rem.isZero()) return digits + result; else { while (digits.length < 6)

digits = '0' + digits;

result = '' + digits + result;

}

}

};

也是sub之后拼出来的。也就是fromstring的反向操作。

相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!

推荐阅读:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/529501.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微分进化算法解决函数优化问题的matlab代码,Matlab微分进化算法及优化函数测试...

微分进化(Difference Evolution&#xff0c;DE)算法是一种优化算法&#xff0c;据称其比GA(遗传算法)等更为优秀。借鉴网上实现的DE算法&#xff0c;用Matlab实现了对若干函数优化问题的解法&#xff0c;代码如下&#xff1a;function [] de_testclear all;close all;clc;%解&…

Oracle中获取文件中的数据,操作oracle中的数据文件

收藏于http://dev.yesky.com/296/8090796.shtmlOracle数据库中管理表空间和数据文件数据库的三大组成部分:数据文件&#xff0c;控制文件&#xff0c;Redo日志。表空间分为系统表空间和非系统表空间。SYSTEM表空间是最基本的&#xff0c;必须的&#xff0c;Oracle建议你为用户数…

oracle 存储过程设置回滚点,(转)oracle 存储过程事宜使用断点回滚 -savepoint

学习存储过程中使用断点回滚事务时&#xff0c;发现目前网络上存在一个问题&#xff0c;那就是使用断点回滚后&#xff0c;都忘记了一个很重要的事情&#xff0c;提交事务。虽然使用了断点回滚&#xff0c;但是断点回滚不像rollBack或commit一样结束当前事务&#xff0c;而使用…

php tp5清空数据表并主键,tp5数据库——更新数据

更新数据更新数据表中的数据Db::table(think_user)->where(id, 1)->update([name > thinkphp]);如果数据中包含主键&#xff0c;可以直接使用&#xff1a;Db::table(think_user)->update([name > thinkphp,id>1]);update 方法返回影响数据的条数&#xff0c;…

oracle几个网络,ORACLE网络的几个重点概念

数据库名(DB_NAME)、数据库实例名(INSTANCE_NAME)、操作系统环境变量ORACLE_SID、数据库服务名 (SERVICE_NAME)、数据库域名(DB_DOMAIN)以及全局数据库名(GLOBAL_DB_NAME)是几个使用Oracle数据库容易混 淆的概念。1、数据库名与实例名数据库名(DB_NAME)&#xff1a;是区分数据的…

oracle每季度补丁,Oracle 2020 年第四季度补丁发布

半个月前&#xff0c;也就是 10 月 20 日&#xff0c; Oracle 发布了今年最后一次补丁更新&#xff0c;那么很多人都想打最新的 PSU&#xff0c;理由是有被扫到各种漏洞&#xff0c;有的扫描工具着实太坑&#xff0c;这里就不用说了&#xff0c;前几天看到盖总发布的文章2020年…

php flash上传进度条,PHP_PHP+FLASH实现上传文件进度条相关文件 下载,PHP之所以很难实现上传进度条 - phpStudy...

PHPFLASH实现上传文件进度条相关文件 下载PHP之所以很难实现上传进度条是因为在我们上传文件到服务器的时候&#xff0c;要等到文件全部送到服务器之后&#xff0c;才执行相应的php文件。在这之前&#xff0c;文件数据保存在一个临时文件里面&#xff0c;而php无法获得这个文件…

oracle截取时间函数6,SQL 取日期部分函数

convert(varchar(10),getdate(),120)这个函数就可以得到日期部分了&#xff0c;我觉得还是比较方便的&#xff0c;我觉得SQL在日期方面&#xff0c;没有ORACLE函数坐的好。。Sql Server中的日期与时间函数1. 当前系统日期、时间select getdate()2. dateadd 在向指定日期加上一…

oracle 找不到程序,Oracle 找不到监听程序

Oracle服务器文件 app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.oraSID_LIST_LISTENER (SID_LIST (SID_DESC (SID_NAME CLRExtProc)(ORACLE_HOME D:\app\Administrator\product\11.2.0\dbhome_1)(PROGRAM extproc)(ENVS "EXTPROC_DLLSONLY:D:\…

oracle中的存储过程教程,oracle 存储过程

-- 查看系统定时任务SELECT * FROM DBA_JOBS-- 新建定时任务DECLAREjobno NUMBER;BEGINSYS.DBMS_JOB.SUBMIT(JOB > jobno, /*自动生成JOB_ID*/WHAT > qmcb_ls_data;, /*需要执行的存储过程名称或SQL语句*/NEXT_DATE > SYSDATE, /*初次执行时间-立即执行*/INTERVAL >…

Oracle segment啥意思,关于oracle数据库段segment的小结

段(segment)是一种在数据库中消耗物理存储空间的任何实体(一个段可能存在于多个数据文件中&#xff0c;因为物理的数据文件是组成逻辑表空间的基本物理存储单位)今天碰到一个高水位问题&#xff1a;一个分区表&#xff0c;删除某个分区中的一些数据后&#xff0c;表空间并没有回…

Linux在文件第一行添加字符,使用shell命令给文件中每一行的前面、后面、指定列添加字符...

shell给一个文件中的每一行开头插入字符的方法&#xff1a;awk {print "X"$0} fileNameshell给一个文件中的每一行结尾插入字符的方法&#xff1a;awk {print $0"X"} fileNameshell给一个文件中的每一行的指定列插入字符的方法&#xff1a;awk $O$O" …

路由器 刷 linux系统版本,在Linux下用tftp刷写路由器固件

(以Buffalo WHR-G300N V2路由器为例)以发行版Ubuntu为例(如果你在Windows下&#xff0c;可下载Ubuntu的ISO文件&#xff0c;再用wubi安装Ubuntu&#xff0c;可免去重新分区的麻烦)&#xff0c;下载Buffalo WHR-G300N V2路由器的FTP版固件文件&#xff0c;放到Ubuntu的/home目录…

linux没有etho网卡,关于怎么解决CENTOS7没有ETH0网卡这个问题

CentOS7系统安装完毕之后&#xff0c;输入ifconfig命令发现没有eth0,不符合我们的习惯。而且也无法远程ssh连接。1.进入目录/etc/sysconfig/network-scripts/2.将文件ifcfg-ens33重命名为ifcfg-eth0;(注意&#xff1a;修改需要切换至root用户)3.编辑ifcfg-eth0使用命令&#xf…

linux添加物理卷编辑文件夹,Red hat Linux下的逻辑卷管理器LVM-上

【IT168 专稿】Red hat 下的LVM 上 LVM是Logical Volume Manager(逻辑卷管理器)的简写&#xff0c;它为主机提供了更高层次的磁盘存储管理能力。LVM可以帮助系统管理员为应用与用户方便地分配存储空间。在LVM管理下的逻辑卷可以按需改变大小或添加移除。另外&#xff0c;LVM可以…

linux的nfs端口号,#Linux NFS服务 固定端口及防火墙配置#

#Linux NFS服务 固定端口及防火墙配置#1.在Linux上正常安装NFS服务2.修改/etc/service,添加以下内容(端口号必须在1024以下&#xff0c;且未被占用)# Local servicesmountd 1011/tcp #rpc.mountdmountd 1011/udp #rpc.mountdrquotad 1012/tcp #rpc.rquotadrquotad 1012/udp #rp…

嵌入式linux添加环境变量,Linux环境变量

前言&#xff1a;1. 环境变量是操作系统环境设置的变量&#xff0c;适用于整个系统的用户进程&#xff1b;2. 环境变量可以在命令中设置&#xff0c;但是用户注销的时候将会丢失这些设置值&#xff1b;3. 若要重复适用&#xff0c;则最好在.profile中定义&#xff1b;环境变量的…

eval函数linux,Python中的eval()、exec()及其相关函数

刚好前些天有人提到eval()与exec()这两个函数&#xff0c;所以就翻了下Python的文档。这里就来简单说一下这两个函数以及与它们相关的几个函数&#xff0c;如globals()、locals()和compile()&#xff1a;1. eval函数函数的作用&#xff1a;计算指定表达式的值。也就是说它要执行…

linux更改语言脚本,Linux shell脚本入门——shell语言脚本【CentOS】

认识脚本是使用一种特定的描述性语言&#xff0c;依据一定的格式编写的可执行文件。脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解释或者编译。学习shell脚本的用途对于一个合格的系…

linux可用的ftp,linuxunix下有很多可用的ftp服务器

一、ftp服务器简介linux/unix下有很多可用的ftp服务器&#xff0c;根据这些ftp服务器的可配置性大概可以分为3类&#xff1a;弱、中等、高。功能比较简单的ftp服务器软件有“ftpd”和“oftpd”。前者与ftp客户端工具“ftp”类似&#xff0c;只实现了标准的ftp功能&#xff0c;支…