I'm not sure if it will preserve the sign bit, though it should be
pretty simple to test. If it works, please let us know (along with which
languages you're trying it in - my guess is that most languages will
play nice but some won't). And if not, the second answer should work no
matter what.
Ephraim Dan wrote:
About why, I think you're right.
About solutions - casting is obviously easier - you don't think it could mess
up the sign bit in the translation? i.e. you think that solution is 64-bit
safe?
Thanks for the reply,
--edan
-----Original Message-----
From: Jonathan Marcus [mailto:[email protected]]
Sent: Tuesday, June 16, 2009 16:29
To: [email protected]
Subject: Re: uint64_t
I'm pretty sure that Thrift doesn't support it because unsigned numbers
aren't supported in all the languages (I could be wrong).
Nonetheless, I can think of two workarounds:
- Cast your number to a 64-bit signed long before transport, then
re-cast it as an unsigned long on the other side.
- Use two int fields to send it, storing the first 32 bits in one
and the second 32 bits in the other.
function prepareForTransport(ulong val) {
int valA = val & 0xFFFFFFFF;
int valB = (val >> 32) & 0xFFFFFFFF;
return array(valA, valB)
}
function decompressFromTransport(int valA, int valB) {
return valA + ((ulong) valB << 32);
}
Not a pretty solution, but it should work just fine.
--Jonathan
Ephraim Dan wrote:
We have some big numbers, that we use "unsigned long long" (uint64_t) for in
our code.
Thrift apparently explicitly doesn't support unsigned integer types.
What are we to do if we do, after all, need to transport such a number using
thrift?
Thanks
--edan