LuHan created THRIFT-2047: ----------------------------- Summary: Thrift.Protocol.TCompactProtocol, intToZigZag data lost (TCompactProtocol.cs) Key: THRIFT-2047 URL: https://issues.apache.org/jira/browse/THRIFT-2047 Project: Thrift Issue Type: Bug Components: C# - Library Affects Versions: 0.9 Environment: Win7, amd64 Reporter: LuHan Priority: Critical
In TCompactProtocol.cs, the function: /** * Convert n into a zigzag int. This allows negative numbers to be * represented compactly as a varint. */ private uint intToZigZag(int n) { return (uint)(((uint)n << 1) ^ ((uint)n >> 31)); } will make wrong number while the integer is negative. Check the test code below: (so do longToZigZag.) =============== using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Test { class Program { static void Main(string[] args) { unchecked { int num = -1; if (num != zigzagToInt(intToZigZag(num))) { Console.WriteLine("Transform failed!"); } else { Console.WriteLine("Transform passed!"); } if (num != zigzagToInt(intToZigZagNew(num))) { Console.WriteLine("Transform failed!"); } else { Console.WriteLine("Transform passed!"); } Console.ReadLine(); } } static int zigzagToInt(uint n) { return (int)(n >> 1) ^ (-(int)(n & 1)); } static uint intToZigZag(int n) { return (uint)(((uint)n << 1) ^ ((uint)n >> 31)); } static uint intToZigZagNew(int n) { return (uint)((n << 1) ^ (n >> 31)); } } } -- This message is automatically generated by JIRA. If you think it was sent incorrectly, please contact your JIRA administrators For more information on JIRA, see: http://www.atlassian.com/software/jira