You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@thrift.apache.org by "Henrique Mendonça (JIRA)" <ji...@apache.org> on 2013/08/13 11:12:50 UTC

[jira] [Closed] (THRIFT-2047) Thrift.Protocol.TCompactProtocol, intToZigZag data lost (TCompactProtocol.cs)

     [ https://issues.apache.org/jira/browse/THRIFT-2047?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Henrique Mendonça closed THRIFT-2047.
-------------------------------------

       Resolution: Fixed
    Fix Version/s: 0.9.1
    
> 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
>              Labels: TCompactProtocol, intToZigZag
>             Fix For: 0.9.1
>
>   Original Estimate: 12h
>  Remaining Estimate: 12h
>
> 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