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,一经查实,立即删除!

相关文章

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

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

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

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

路由器 刷 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目录…

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视图版怎么输入命令,分享在Linux命令下操作MySQL视图实例代码

视图VIEW命令简介&#xff1a;VIEW视图就是存储下来的SELECT语句数据1。创建视图命令格式&#xff1a;创建[或更换][ALGORITHM {UNDEFINED | MERGE | 不是Temptable}][DEFINER {user | 当前用户 }][SQL SECURITY {DEFINER | INVOKER}]VIEW view_name [(column_list)]AS selec…

宝塔linux 做负载均衡,利用BT宝塔面板做网站多服务器负载均衡图文教程

对于我们做网站的来说&#xff0c;如果流量大了&#xff0c;一台服务器肯定是不够的&#xff0c;接下来要考虑很多方面&#xff0c;比如动静分离、比如数据库异步&#xff0c;比如负载均衡等等。因为我们很多新手站长都用的是BT宝塔面板&#xff0c;下面虾皮路就介绍一下利用BT…

血型遗传关系c语言编程,根据血型遗传关系,编程实现:○1.输入

满意答案df4dfw5e562017.05.28采纳率&#xff1a;51% 等级&#xff1a;6已帮助&#xff1a;106人//仅作参考#include "stdio.h"#include "conio.h"#include "stdlib.h"#include "string.h"int studentNum 0;#define MAXSTUDENT (1…

android 通话结束广播,在Android中以编程方式结束通话

侃侃尔雅您无需成为系统应用程序。首先&#xff0c;com.android.internal.telephony在您的项目中创建包&#xff0c;并将其放入名为“ ITelephony.aidl” 的文件中&#xff1a;package com.android.internal.telephony; interface ITelephony { boolean endCall(); vo…

带nfc 的 android 华为,华为手机NFC功能,原来这么好用,不会用真可惜几千块钱了...

华为手机NFC功能&#xff0c;原来这么好用&#xff0c;不会用真可惜几千块钱了2019-05-06 17:40:259点赞12收藏6评论华为手机在国内也是数一数二的了&#xff0c;那么用华为手机的小伙伴&#xff0c;怎么能错过华为手机中NFC的功能呢&#xff1f;下面就随小编一起来了解一下吧。…

小米3升级android 6.0,可升级Android 6.0机型一览 小米手机亮了

前不久&#xff0c;Android M被谷歌正式确定为6.0系统&#xff0c;代号Marshmallow&#xff0c;预计年底前发布。而对于普通用户来说&#xff0c;最关心的就是自己的手机能不能升级。不过别着急&#xff0c;在此之前&#xff0c;我们不妨看看Android 6.0有哪些新功能。一、Andr…

浏览器兼容性怎么设置HTML,ie10浏览器中兼容性设置在哪里

之前ie浏览器一直被诟病的因素之一就是兼容性&#xff0c;不过ie10浏览器可以对兼容性进行设置&#xff0c;使得在兼容性视图中显示所有网站&#xff0c;具体怎么设置呢。下面由学习啦小编为你整理了ie10浏览器兼容性设置在哪里的解决方法&#xff0c;希望对你有帮助!ie10兼容性…

ksu7对讲机调频软件_科普 | 数字对讲机的群呼功能原理是什么?你了解多少?...

点击上方蓝字关注我们&#xff01;无线对讲机群呼&#xff0c;是为了更好地达到1个数字对讲机能够同一时间跟多个数字对讲机实现语音通话。群呼跟单呼有很多共同之处&#xff0c;下面我们和大家来说说数字对讲机群呼与单呼不同点。当1个数字对讲机处在待机状态的情况下机要发动…

计算机学不学工程制图,大一,马上要考试了,不想再学工程制图了?

买买提烤串累计帮助了195人工科和文科思维方式是不一样的。本人刚好高中理科&#xff0c;大学学文的&#xff0c;而且一专业是中文&#xff0c;二专业管理。大多数工科的特点是靠努力为主的&#xff0c;除了特别难的那种专业&#xff0c;大多数工科的特点是这样的&#xff1a;除…

辅助驾驶等级_双AMR电机位置传感器,助力自动驾驶安全出行

好文章当然要分享啦~如果您喜欢这篇文章&#xff0c;请联系后台添加白名单&#xff0c;欢迎转载哟~在自动驾驶汽车快速发展的今天&#xff0c;汽车电气化趋势逐渐朝着半自动驾驶和全自动驾驶发展&#xff0c;尤其是&#xff0c;为了让电子转向助力(EPS)和电子制动系统满足必要的…

计算机怎么建立共享网络打印机共享,电脑如何连接局域网中的共享打印机—两种方法...

多台电脑而只有一台打印机的时候可以通过连接局域网的方式共享打印机&#xff0c;这样就不需要给每一台电脑都配上打印机了。下面是学习啦小编收集整理的电脑如何连接局域网中的共享打印机—两种方法&#xff0c;希望对大家有帮助~~电脑连接局域网中的共享打印机—两种方法操作…

html5 密码框明文,elementUI的密码框的密文和明文

基于elementui 框架的登录时密码框的明文和密文登录1、templatev-model.trim"ruleForm.password"placeholder"请输入密码":type"passw"clearableblur"onBlur">2、scriptdata(){return{icon: "el-input__icon el-icon-view&quo…

1个显示器分割2画面_我家房子100㎡,原始设计有2个卫生间,纠结保留1个还是2个...

100平米左右的新房装修&#xff0c;设计布局最纠结。尤其是&#xff0c;面积本来就是中等、不大的户型&#xff0c;开发商还给配了2个卫生间。一个主卫&#xff0c;一个客卫。那么问题来了&#xff1a;对于主卧卫生间&#xff0c;我到底是保留还是改成其他的用途&#xff1f;只…

计算机考研数据结构用哪本书,计算机考研数据结构该用哪本参考书?

baoqinshuai新兵答主02-19TA获得超过920个赞一、机械类专业介绍&#xff1a;1、机械设计制造及其自动化机械设计制造及其自动化专业是传统的机械设计制造和先进的自动化技术相结合的产物&#xff0c;是机电一体化的宽口径专业&#xff0c;机械行业是个老行业&#xff0c;人才需…

计算机专业接本应用心理学,专接本接应用心理学但遇到阻挠?

沫沫累计帮助了30人我也是学心理的&#xff0c;学姐你好选专业这件事情&#xff0c;有的放弃自己的意愿&#xff0c;走上了不喜欢的那条路&#xff0c;最后结果对自己来说无论如何都是苦的。有的人跟随了自己的意愿&#xff0c;最后结果不好的 又会埋怨父母当初为什么不加以阻拦…