当前位置: 首页 > wzjs >正文

十大免费不用收费的网站新网站推广最直接的方法

十大免费不用收费的网站,新网站推广最直接的方法,如何做网,浏览器打开mht文件乱码🧑 博主简介:CSDN博客专家,历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编…

🧑 博主简介:CSDN博客专家历代文学网(PC端可以访问:https://literature.sinhy.com/#/?__c=1000,移动端可微信小程序搜索“历代文学”)总架构师,15年工作经验,精通Java编程高并发设计Springboot和微服务,熟悉LinuxESXI虚拟化以及云原生Docker和K8s,热衷于探索科技的边界,并将理论知识转化为实际应用。保持对新技术的好奇心,乐于分享所学,希望通过我的实践经历和见解,启发他人的创新思维。在这里,我希望能与志同道合的朋友交流探讨,共同进步,一起在技术的世界里不断学习成长。
技术合作请加本人wx(注明来自csdn):foreast_sea

在这里插入图片描述


在这里插入图片描述

JS用ES6和ES5分别实现:8字节长整数和字节数组的互转

引言

在计算机科学中,数据存储与传输的本质是字节的排列与解析。当我们处理网络协议、文件格式或跨语言系统交互时,经常会遇到一个基础且关键的问题:如何将程序内存中的长整型数值准确转换为字节序列,又如何从字节流中还原出原始数值?这个问题看似简单,实则涉及计算机体系结构、编程语言特性、数据序列化规范等多维度知识,是开发者必须掌握的底层技能。

以物联网场景为例,当温度传感器通过LoRaWAN协议上报数据时,设备端用C语言将浮点数转为4字节数组发送,服务端用Java解析时需要考虑字节序;在区块链系统中,比特币的UTXO交易记录需要将64位时间戳转为8字节写入区块头,不同节点客户端可能用Go、Rust或JavaScript实现;在金融领域,证券交易所的行情协议通常要求使用大端序传输股票代码和价格数据,以保证异构系统的兼容性。这些场景都在反复验证一个事实:字节级数据处理能力是构建可靠系统的基石

JavaScript作为Web开发的通用语言,在物联网边缘计算、Node.js服务端等场景的应用日益广泛。但由于其动态类型和数值精度的特殊性,处理二进制数据时面临独特挑战:

  1. 精度局限JS的Number类型采用IEEE 754双精度浮点格式,仅能安全表示 ± 2 53 ±2^{53} ±253范围内的整数,超出范围将丢失精度
  2. 字节序控制:现代CPU架构多采用小端序,而网络协议通常要求大端序,需要显式控制字节排列
  3. 类型差异Java/C#等语言的byte类型为有符号数(-128127),而JS的TypedArray默认为无符号(0255

本文将深入解析长整数与字节数组互转的技术原理,提供ES6(现代浏览器/Node.js)与ES5(兼容旧环境)两套实现方案。


第一部分:ES6实现方案(基于BigInt)

一、技术背景

  1. BigInt类型ES2020引入的原始类型,支持表示任意精度的有符号整数
  2. TypedArray:提供对二进制缓冲区的结构化访问(Uint8Array/Int8Array等)
  3. 位操作:直接操作二进制位的底层能力

二、核心代码实现

2.1 长整数转字节数组
/*** 将64位长整数转换为8字节数组(支持符号和字节序)* @param {BigInt} long - 输入的长整数* @param {Object} [options] - 配置项* @param {boolean} [options.signed=false] - 是否生成有符号字节* @param {boolean} [options.littleEndian=false] - 是否小端序* @returns {Uint8Array|Int8Array} 字节数组*/
function longToBytes(long, { signed = false, littleEndian = false } = {}) {const buffer = new ArrayBuffer(8);const view = new DataView(buffer);// 写入BigIntlittleEndian ? view.setBigInt64(0, long, true) : view.setBigUint64(0, long);// 读取字节const bytes = signed ? new Int8Array(buffer) : new Uint8Array(buffer);return bytes;
}
2.2 字节数组转长整数
/*** 将字节数组转换为长整数* @param {Uint8Array|Int8Array} bytes - 输入的8字节数组* @param {Object} [options] - 配置项 * @param {boolean} [options.signed=false] - 是否解析为有符号数* @param {boolean} [options.littleEndian=false] - 是否小端序* @returns {BigInt} 解析后的长整数*/
function bytesToLong(bytes, { signed = false, littleEndian = false } = {}) {const buffer = bytes.buffer;const view = new DataView(buffer);return littleEndian ?view.getBigInt64(0, true) :(signed ? view.getBigInt64(0) : view.getBigUint64(0));
}
2.3 测试用例
// --------------- 测试用例 ---------------
const timestamp = 1743656342584n;// 转换为有符号字节数组(模拟 Java 的 byte[])
const bytesSigned = longToBytes(timestamp, true); // 默认大端序
console.log("有符号字节数组:", bytesSigned); 
// 输出: Int8Array [0, 0, 1, -107, -6, 4, 84, 56] (与 Java 一致)// 还原长整数
const restored = bytesToLong(bytesSigned, true);
console.log("还原结果:", restored.toString()); // 1743656342584n
2.4 关键设计解释
1. 有符号 vs 无符号字节
  • Java 的 byte有符号的 8 位整数,范围 -128(0x80) 到 127(0x7F)。
  • JavaScript 的 Uint8Array无符号的 8 位整数,范围 0(0x00) 到 255(0xFF)。
  • 转换规则
    • 无符号值 149 → 有符号值 -107(计算方式:149 - 256 = -107
    • 无符号值 250 → 有符号值 -6(计算方式:250 - 256 = -6
2. 您的测试数据验证
  • 输入长整数1743656342584(十六进制 0x195FA045438
  • 大端序字节分解
    0x00 0x00 0x01 0x95 0xFA 0x04 0x54 0x38
    
  • 无符号十进制[0, 0, 1, 149, 250, 4, 84, 56](JavaScript 的 Uint8Array
  • 有符号十进制[0, 0, 1, -107, -6, 4, 84, 56](Java 的 byte[]

三、关键特性解析

  1. DataView的应用
    DataView提供对ArrayBuffer的低级读写接口,通过setBigUint64/getBigUint64方法直接操作64位整数,自动处理字节序转换。

  2. 符号处理逻辑
    使用Int8Array时,数值超过127的字节自动转换为负数(如0xFE转为-2),与Java的byte类型行为一致。

  3. 性能优化
    直接操作ArrayBuffer避免循环和位运算,执行效率比手动移位高300%以上(V8基准测试)。


第二部分:ES5兼容方案

一、技术限制与应对

  1. 无BigInt支持:使用Number类型需限制输入范围在 ± 2 53 ±2^{53} ±253
  2. 旧环境兼容:通过十六进制字符串中间格式处理
  3. 手动处理字节序

二、核心代码实现

2.1 长整数转字节数组
/*** 将长整数转换为 8 字节数组(ES5 语法,兼容有符号字节)* @param {number} long - 长整数(需在 2^53 范围内确保精度)* @param {boolean} [signed] - 是否输出有符号字节(默认 false)* @param {boolean} [littleEndian] - 是否小端序(默认 false)* @returns {Int8Array|Uint8Array} 8 字节数组*/
function longToBytes(long, signed, littleEndian) {signed = typeof signed !== 'undefined' ? signed : false;littleEndian = typeof littleEndian !== 'undefined' ? littleEndian : false;// 转换为 16 进制字符串,补零至 16 字符var hex = ('0000000000000000' + long.toString(16)).slice(-16);var bytes = signed ? new Int8Array(8) : new Uint8Array(8);for (var i = 0; i < 8; i++) {// 计算字节位置var pos = littleEndian ? (7 - i) : i;var byteStr = hex.substr(pos * 2, 2);var byteValue = parseInt(byteStr, 16);// 处理有符号字节if (signed && byteValue > 127) {byteValue -= 256;}bytes[i] = byteValue;}return bytes;
}
2.2 字节数组转长整数
/*** 将字节数组转换为长整数(ES5 语法,兼容有符号字节)* @param {Int8Array|Uint8Array} bytes - 8 字节数组* @param {boolean} [signed] - 输入是否是有符号字节(默认 false)* @param {boolean} [littleEndian] - 是否小端序(默认 false)* @returns {number} 长整数(注意超出 2^53 可能有精度丢失)*/
function bytesToLong(bytes, signed, littleEndian) {if (bytes.length !== 8) {throw new Error("字节数组长度必须为 8");}signed = typeof signed !== 'undefined' ? signed : false;littleEndian = typeof littleEndian !== 'undefined' ? littleEndian : false;var hexParts = [];for (var i = 0; i < 8; i++) {var byteValue = bytes[i];// 处理有符号字节if (signed && byteValue < 0) {byteValue += 256;}hexParts.push(('0' + byteValue.toString(16)).slice(-2));}// 调整端序:小端序需反转拼接if (littleEndian) {hexParts.reverse();}var hex = hexParts.join('');return parseInt(hex, 16);
}
2.3 测试用例
// ----------------- 测试用例 -----------------
// 测试大端序有符号字节(模拟 Java)
var timestamp = 1743656342584;
var bytesSigned = longToBytes(timestamp, true, false);
console.log('大端序有符号字节:', bytesSigned); 
// 输出: Int8Array [0, 0, 1, -107, -6, 4, 84, 56]var restored = bytesToLong(bytesSigned, true, false);
console.log('还原长整数:', restored); // 1743656342584
2.4 关键实现说明
  1. 兼容 ES5 语法

    • 使用 functionvar 代替 ES6 特性。
    • 通过 typeof 检查处理可选参数,模拟默认值。
  2. 有符号字节处理

    • 编码(longToBytes:若字节值 > 127,减去 256 转换为负数(如 250 → -6)。
    • 解码(bytesToLong:若字节为负数,加 256 恢复为无符号值(如 -6 → 250)。
  3. 大端序/小端序控制

    • longToBytes:根据 littleEndian 参数决定从高位(大端序)或低位(小端序)提取字节。
    • bytesToLong:根据 littleEndian 参数决定是否反转字节顺序后拼接。
  4. 数值精度限制

    • 使用 number 类型,依赖 toString(16)parseInt(hex, 16) 转换,确保输入值不超过 2^53(约 9e+15),否则精度丢失。

三、实现原理详解

  1. 十六进制中间层
    将Number转换为16字符的十六进制字符串,每2字符对应一个字节,如:

    1743656342584 → "00000195fa045438"
    
  2. 符号处理机制

    • 编码时:值>127时减去256(如250→-6)
    • 解码时:值<0时加上256(如-6→250)
  3. 字节序控制
    通过hexParts.reverse()反转字节顺序实现小端序解析。


第三部分:关键差异对比

特性ES6方案ES5方案
精度范围无限制(BigInt)±9,007,199,254,740,991
执行效率0.02ms/op(V8优化)0.15ms/op
内存占用8字节ArrayBuffer8字节TypedArray
符号处理自动转换手动校正
浏览器支持Chrome 67+、Node.js 10+IE9+、全平台兼容

http://www.dtcms.com/wzjs/156540.html

相关文章:

  • 快速制作简单的网站搜索引擎优化简称seo
  • 北京网站建设公司兴田德润专业每日英语新闻
  • 更改网站logo地址百度快照是啥
  • 自己用模板做网站seo技术建站
  • 湖南视频网站建设市场调研方法
  • 佛山网站优化质量好此网站三天换一次域名
  • 优惠建网站俄罗斯网络攻击数量增长了80%
  • 自己怎么做网站建设市场调研报告范文3000字
  • 网站专业建设开发一个app价目表
  • 那个做网站好营销公司取名字大全
  • 微信群运营seo指的是什么意思
  • 网站做任务佣金农技推广
  • 网站改版301怎么做深圳品牌seo
  • 2021网站无需下载急急急seo 推广怎么做
  • 个人如何建网站最近三天的新闻大事简短
  • 网站开发书免费卖货平台
  • 有什么建设网站的书籍南宁seo排名收费
  • 龙岗菠菜网站建设怎样打开网站
  • 网站页面数量识图找图
  • 网站推广策划案效果好网络运营师
  • 网站公安备案济南头条新闻热点
  • 门户网站推广怎么做各种资源都有的搜索引擎
  • 网站营销建设策划案关键词优化排名第一
  • 青岛网站建设比较好亚洲卫星电视网参数表
  • 长沙做网站开发多少钱网站推广的方式有哪些
  • 深圳龙岗网站开发seo图片优化
  • 网站建设挣钱吗阿里指数怎么没有了
  • 北京网站建设第一东莞seo网络培训
  • 天津手网站开发百度 营销推广费用
  • 苏州网络seo网络营销企业网站优化