dcodeIO / long.js

A Long class for representing a 64-bit two's-complement integer value.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

protobuf fromNumber encoding error

acode-x opened this issue · comments

commented

Hi,

I am trying to assign a protobuf field which stores an int64 value.
I notice fromString works perfectly fine, but fromNumber doesn't

message AwesomeMsg1 {\
    int64 my_int64 = 1;\
}\
';

protobuf.parse(protofile, root, {keepCase : true, alternateCommentMode : true});
root.resolveAll();
var AwesomeMsg1 = root.lookup(".AwesomeMsg1");

var max_int64 = 9223372036854775000;
console.log(typeof max_int64); // number
console.log(max_int64); // 9223372036854775000

var obj1 = AwesomeMsg1.create({});
obj1.my_int64 = Long.fromNumber(max_int64, false);
encoded_buffer = AwesomeMsg1.encode(obj1).finish();
console.log(encoded_buffer.toString('hex')); // 3080f8ffffffffffff7f

var obj2 = AwesomeMsg1.create({});
obj2.my_int64 = Long.fromString(max_int64.toString(), false);
encoded_buffer = AwesomeMsg1.encode(obj2).finish();
console.log(encoded_buffer.toString('hex')); // 30d8f9ffffffffffff7f

As you see from above, hex of both values above are different.
Maybe I am missing out something obvious.

Requesting help on same.

Thanks

commented

Values larger than Number.MAX_SAFE_INTEGER = 9007199254740991 cannot be safely represented in JS as a normal number, which is why long.js exists (see). It is expected that constructing a Long from a number with a larger value is inaccurate, because the number used is already inaccurate.

commented

Understood.
Thanks for the explanation!