当前位置: 首页 > 编程日记 > 正文

protobufjs 命令执行_【原码笔记】-- protobuf.js 与 Long.js

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

(function(global, undefined) {"use strict";

(functionprelude(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();

}

});returnproto;

}//CommonJS

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

module.exports=proto;

})//传参

({1: [function(require, module, exports) {functionfirst() {

console.log("first");

}

module.exports=first;

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

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。

functionfromString(str, unsigned, radix) {if (str.length === 0)throw Error('empty string');if (str === "NaN" || str === "Infinity" || str === "+Infinity" || str === "-Infinity")returnZERO;if (typeof unsigned === 'number') {//For goog.math.long compatibility

radix =unsigned,

unsigned= false;

}else{

unsigned= !!unsigned;

}

radix= radix || 10;if (radix < 2 || 36 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 div.

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;returnresult;

}

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

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

eb0ee56bc8134d3ba55384efc619bd60.png

functionfromBits(lowBits, highBits, unsigned) {return newLong(lowBits, highBits, unsigned);

}

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

最后的合并是通过|运算。位移之后再还原确实很巧妙。一时看上去都不大理解。

LongPrototype.add = functionadd(addend) {if (!isLong(addend))

addend=fromValue(addend);//Divide 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);

};

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

toString

LongPrototype.toString = functiontoString(radix) {

radix= radix || 10;if (radix < 2 || 36

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),

div= this.div(radixLong),

rem1= div.mul(radixLong).sub(this);return div.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 div.

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

rem= this;var result = '';while (true) {var remDiv =rem.div(radixToPower),

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

digits=intval.toString(radix);

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

digits= '0' +digits;

result= '' + digits +result;

}

}

};

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

相关文章:

IBM X3550 RAID 扩容实例

背景&#xff1a;系统更新&#xff0c;原服务器容量不足&#xff0c;原服务器硬盘配置如下&#xff1a;2块146G 10K SAS 硬盘组成的RAID 1&#xff0c;咨询供应商&#xff0c;原来的硬盘已停产&#xff0c;现只有直接上两块新的盘增加一个RAID 1 实现扩容&#xff0c;增加两块3…

react取消监听scroll事件

如果要移除事件addEventListener的执行函数必须使用外部函数而不能直接使用匿名函数 错误写法&#xff1a; // 这样写是移除不了滚动事件的 componentDidMount() {// 添加滚动监听window.addEventListener(scroll, ()>{console.log("滚动距离&#xff1a;",window…

ceph存储 PG的状态机 源码分析

文章目录PG 的状态机和peering过程1. PG 状态机变化的时机2. pg的状态演化过程3. pg状态变化实例讲解3.1 pg状态的管理结构3.2 数据的pg状态变化过程3.2.1 NULL -> initial3.2.2 initial -> reset -> Started3.2.3 Started(start) ->Started( primary(Peering(GetI…

JDBC连接MySQL数据库及演示样例

JDBC是Sun公司制定的一个能够用Java语言连接数据库的技术。 一、JDBC基础知识 JDBC&#xff08;Java Data Base Connectivity,java数据库连接&#xff09;是一种用于执行SQL语句的Java API&#xff0c;能够为多种关系数据库提供统一訪问&#xff0c;它由一组用Java语言…

Linux从mysql中读取数据_linux shell中读写操作mysql数据库

本文介绍了如何在shell中读写mysql数据库。主要介绍了如何在shell 中连接mysql数据库&#xff0c;如何在shell中创建数据库&#xff0c;创建表&#xff0c;插入csv文件&#xff0c;读取mysql数据库&#xff0c;导出mysql数据库为xml或html文件&#xff0c; 并分析了核心语句。本…

算法系列之二十:计算中国农历(二)

&#xff08;接上篇&#xff09; 所谓的“天文算法”&#xff0c;就是利用经典力学定律推导行星运转轨道&#xff0c;对任意时刻的行星位置进行精确计算&#xff0c;从而获得某种天文现象发生时的时间&#xff0c;比如日月合朔这一天文现象就是太阳和月亮的地心黄经&#xff08…

如何限制只有某些IP才能使用Tomcat Manager

只有指定的主机或IP地址才可以访问部署在Tomcat下的应用。Tomcat提供了两个参数供你配置&#xff1a;RemoteHostValve 和RemoteAddrValve&#xff0c;前者用于限制主机名&#xff0c;后者用于限制IP地址。 通过配置这两个参数&#xff0c;可以让你过滤来自请求的主机或IP地址&a…

leetcode-24 两两交换链表中的节点

题目描述 给定一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后的链表。 你不能只是单纯的改变节点内部的值&#xff0c;而是需要实际的进行节点交换。 示例: 给定 1->2->3->4, 你应该返回 2->1->4->3. 方法一&#xff08;递归&#x…

TimeQuest学习之三------外部寄存器模型

clock skew < destination reg clock delay > - < source reg clock delay > 为了使clock skew 的影响可以叠加到data delay上&#xff0c;给出如下三组公式&#xff08;对于fpga2ic&#xff09;&#xff1a; 1.clock skew <ext_clk delay> - < fpga_cl…

linux mysql远程链接_Linux下mysql实现远程连接

首先明白一点并不是mysql禁止远程连接&#xff0c;而是MYSQL的账号禁止远程连接。可能觉得我有点咬文嚼字了&#xff0c;不过我感觉分清这点还是很重要的。默认情况下&#xff0c;所有账号都是禁止远程连接的。在安装MYSQL的时候&#xff0c;在设置ROOT密码那里有一个CHECKBOX&…

H5 客户端设置title 滑动验证码

转载于:https://www.cnblogs.com/Airoocle/p/10420140.html

leetcode-2 两数相加

给出两个 非空 的链表用来表示两个非负的整数。其中&#xff0c;它们各自的位数是按照 逆序 的方式存储的&#xff0c;并且它们的每个节点只能存储 一位 数字。 如果&#xff0c;我们将这两个数相加起来&#xff0c;则会返回一个新的链表来表示它们的和。 您可以假设除了数字 0…

spring-注解

spring框架提供xml文件的配置&#xff0c;也提供基于注解的方式实现配置任何的Bean实例&#xff0c;目前&#xff0c;struts2、hibernate和spring都相继支持基于注解的实现方式。spring要求程序员指定搜索哪些路径下的java类&#xff0c;spring会把合适的java类全部注册成sprin…

mysql raw_Oracle中的Raw类型解释

RAW&#xff0c;类似于CHAR&#xff0c;声明方式RAW(L)&#xff0c;L为长度&#xff0c;以字节为单位&#xff0c;作为数据库列最大2000&#xff0c;作为变量最大32767字节。 LONG RAW&#xff0c;类似于LORAW&#xff0c;类似于CHAR&#xff0c;声明方式RAW(L)&#xff0c;L为…

面试题6:用两个栈实现队列

思路&#xff1a;设置两个栈stack1和stack2&#xff0c;stack1实现入队列功能&#xff0c;stack2实现出队列功能。 &#xff08;1&#xff09;入队列&#xff1a;入栈stack1 &#xff08;2&#xff09;出队列&#xff1a;若stack2不空&#xff0c;则直接弹出stack2中的栈顶元素…

php从数据库读取中文显示问号??的解决办法

出错原因&#xff1a;1、数据库编码格式不对 2、PHP编码格式不对 3、浏览器编码格式不对 上面三者编码格式不统一&#xff0c;就会出现问题 数据库读取的时候在mysqli_connect()之后要设置连接字符编码mysqli_query($db, “set names ‘utf8”);这样才能保证在浏览器显示的结果…

leetcode-20 有效的括号匹配

给定一个只包括 ‘(’&#xff0c;’)’&#xff0c;’{’&#xff0c;’}’&#xff0c;’[’&#xff0c;’]’ 的字符串&#xff0c;判断字符串是否有效。 有效字符串需满足&#xff1a; 左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。 注意空字符串可…

将ADS1.2的工程迁移到KEIL上-基于2440

新版的MDK支持2440相关芯片,但是很多人的工程都是基于ADS1.2开发,文字不好看,兼容性不好等等问题,而且电脑上装太多开发工具切换起来也麻烦,所以切换到MDK开发2440裸机程序应该是一个很好的选择 1. 新建MDK工程,芯片选择2440 不拷贝启动代码,因为我们用自己的启动代码 2.…

mysql占用资源最小的语句_MySQL一个语句查出各种整形占用字节数及最大最小值的实例...

直接上码&#xff1a;select bigint unsigned as type ,8 as bytes ,~0 as max_num,0 as min_num unionselect int unsigned,4,~0>>32,0 unionselect mediumint unsigned,3,~0>>40,0 unionselect smallint unsigned,2,~0>>48,0 unionselect tinyint unsigned…

使用命名管道的OVERLAPPED方式实现非阻塞模式编程 .

命令管道是进程间通讯的一种常用方式&#xff0c;对于命令管道的介绍可以参考别的资料和书籍&#xff0c;这里推荐一个《VC下命名管道编程的原理及实现》这篇博文&#xff0c;写得比较清楚。但是都是介绍了阻塞模式的编程&#xff0c;我这里主要是介绍利用命令管道OVERLAPPED方…

读梦断代码有感(1)2019.2.05

今天阅读了建民老师推荐的我们软件工程方面的书籍被称为经典的《梦断代码》&#xff0c;虽然只是读了一小部分但还是感受颇深&#xff0c;在我以往的经验看来&#xff0c;我们软件工程专业的书籍应该都是枯燥乏味的代码啊啥的&#xff0c;所以开始我并没有对这本书有多大的期望…

leetcode-25 K个一组反转链表

给你一个链表&#xff0c;每 k 个节点一组进行翻转&#xff0c;请你返回翻转后的链表。 k 是一个正整数&#xff0c;它的值小于或等于链表的长度。 如果节点总数不是 k 的整数倍&#xff0c;那么请将最后剩余的节点保持原有顺序。 示例 : 给定这个链表&#xff1a;1->2-…

自己动手写简单的web应用服务器(4)—利用socket实现文件的下载

直接上源码&#xff1a; 服务器&#xff1a; 1 package download;2 3 import java.io.BufferedInputStream;4 import java.io.BufferedOutputStream;5 import java.io.File;6 import java.io.FileInputStream;7 import java.io.IOException;8 import java.io.OutputStream;9 im…

mysql 数据泵_Oracle 数据泵详解

一、 EXPDP和IMPDP使用说明 Oracle Database 10g引入了最新的数据泵(Data Dump)技术&#xff0c;数据泵导出导入(EXPDP和IMPDP)的作用 1)实现逻辑备份和逻辑恢复. 2)在数据库用户之间移动对象. 3)在数据库之间移动对象 4)实现表空间搬移. 二、数据泵导出导入与传统一、EXPDP和I…

php 使用curl模拟登录discuz以及模拟发帖

<?php$discuz_url http://127.0.0.1/discuz/;//论坛地址$login_url $discuz_url .logging.php?actionlogin;//登录页地址 $post_fields array();//以下两项不需要修改$post_fields[loginfield] username;$post_fields[loginsubmit] true;//用户名和密码&#xff0c;必…

Java数组的初始化

1.动态初始化 数据类型 [] 变量名 new 数据类型 [数组大小]; //数组的动态初始化int [] arr new int [3]; 2.静态初始化 数据类型 [] 变量名 {元素1&#xff0c;元素2.....} //数组的静态初始化int [] arr2 {1,2,3}; 转载于:https://www.cnblogs.com/luguankun/p/1043128…

leetcode-135 分发糖果

题目描述&#xff1a; 老师想给孩子们分发糖果&#xff0c;有 N 个孩子站成了一条直线&#xff0c;老师会根据每个孩子的表现&#xff0c;预先给他们评分。 你需要按照以下要求&#xff0c;帮助老师给这些孩子分发糖果&#xff1a; 每个孩子至少分配到 1 个糖果。 相邻的孩子…

mysql主从数据库含义_(转)Mysql数据库主从心得整理

管理mysql主从有2年多了&#xff0c;管理过200多组mysql主从&#xff0c;几乎涉及到各个版本的主从&#xff0c;本博文属于总结性的&#xff0c;有一部分是摘自网络&#xff0c;大部分是根据自己管理的心得和经验所写&#xff0c;整理了一下&#xff0c;分享给各位同行&#xf…

Const 重载解析

1. Const重载应用场景 首先&#xff0c;对于函数值传递的情况&#xff0c;因为参数传递是通过复制实参创建一个临时变量传递进函数的&#xff0c;函数内只能改变临时变量&#xff0c;但无法改变实参。则这个时候无论加不加const对实参不会产生任何影响。但是在引用或指针传递函…

Ubuntu手机系统会成为第四大手机系统吗

啊蛋评论&#xff1a;先不说哪令人“卧槽”的配置&#xff01;就冲着这双系统。。也要体验一下&#xff01;&#xff08;lz不是给ubuntu写软文的。完全是个人评论。&#xff09; Ubuntu开发商Canonical发布了代号为Edge的智能手机&#xff0c;与其说是发布&#xff0c;倒不如…