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