关于js使用protobuf中的int64的问题

本文讨论了在源码仓库中的代码如何从旧版使用number表示的int64转换为新版protobuf.js中的string,以解决在JavaScript中处理大整数如时间戳和哈希值时的精度问题。同时介绍了消息格式`MsgHello`的结构,以及这种改变对其他语言的兼容性影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

源码仓库:https://github.com/robinfoxnan/BirdTalkServer/

默认情况下,生成的js代码中使用number表示int64,这样在具体交互过程中,数据就不精准,比如时间戳,或者crc64哈希都无法使用了;

在目前新版本的protoc可以根据标记,将int64在JS中使用string 来表示,具体换算数据时候使用Bigint对象;

// 首先需要同步客户端的基础信息,服务端应答各种信息
message MsgHello {
  string clientId = 1;      // 客户端标识,用于区分不同客户端
  string version = 2;       // 客户端的版本信息
  string platform = 3;      // 客户端运行的平台信息(例如:iOS、Android、Windows等)
  // 其他可能的字段,取决于你的需求
  string stage = 5;         // 状态数据, clienthello, serverhello,
  int64  keyPrint = 6  [jstype = JS_STRING];      // 对称密钥指纹,用于SID
  int64  rsaPrint = 7  [jstype = JS_STRING];      // 自己的公钥指纹
  map<string, string> params = 8;  // redirect->ip:port, dht
}

这样标记之后,对于其他的语言并没有影响,在JS中可以做到兼容;

JavaScript使用 Protocol Buffers(protobuf)可以帮助您在不同应用程序之间高效地序列化和传输数据。下面是一些使用 protobuf 的基本步骤: 1. 定义消息结构:首先,您需要创建一个 .proto 文件来定义消息结构。在该文件中,您可以定义消息的字段、类型和其他属性。例如,下面是一个简单的示例: ``` syntax = "proto3"; message Person { string name = 1; int32 age = 2; repeated string hobbies = 3; } ``` 2. 生成代码:接下来,您需要使用 protobuf 编译器将 .proto 文件编译为适用于 JavaScript 的代码。可以使用 protobuf 库提供的 protoc 编译器或其他第三方库来完成这一步骤。编译后,您将获得一个包含生成的 JavaScript 代码的文件。 3. 使用生成的代码:一旦您生成了 JavaScript 代码,您可以在您的应用程序中使用它来序列化和反序列化消息。首先,您需要引入生成的代码文件。然后,您可以使用该文件中定义的类和方法来创建、设置和获取消息的字段值。 以下是一个示例,演示了如何在 JavaScript使用生成的 protobuf 代码: ```javascript // 引入生成的代码 const { Person } = require('./generated-code/person_pb'); // 创建一个新的 Person 消息 const person = new Person(); person.setName('John'); person.setAge(25); person.setHobbiesList(['reading', 'swimming']); // 序列化消息为字节 const bytes = person.serializeBinary(); // 反序列化字节为消息 const deserializedPerson = Person.deserializeBinary(bytes); // 获取消息的字段值 console.log(deserializedPerson.getName()); // 输出:John console.log(deserializedPerson.getAge()); // 输出:25 console.log(deserializedPerson.getHobbiesList()); // 输出:['reading', 'swimming'] ``` 这只是一个简单的示例,您可以根据您的需求扩展和自定义消息结构和操作。请注意,您需要先安装适用于 JavaScriptprotobuf 库,并按照其提供的说明进行设置和使用。 希望这些信息对您有所帮助!如有更多问题,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值