从Int到Hex的14位编码/解码,反之亦然

时间:2016-10-23 21:48:18

标签: c# .net encoding decoding

所以我要解决这个问题:

编写一个包含一对

功能的小程序
  1. 将整数转换为特殊文本编码,然后

  2. 将编码值转换回原始整数。

  3. 编码功能

    此函数需要接受14位范围内的有符号整数[-8192 .. + 8191]并返回4个字符的字符串。

    编码过程如下:

    1. 将8192添加到原始值,因此其范围转换为[0..16383]

    2. 将该值打包成两个字节,以便清除每个字节的最高位

    3. 未编码的中间值(作为16位整数):

      00HHHHHH HLLLLLLL
      

      编码值:

      0HHHHHHH 0LLLLLLL
      
      1. 将两个字节格式化为单个4个字符的十六进制字符串并将其返回。
      2. 示例值:

        Unencoded (decimal)  Encoded (hex)
        
        0                    4000
        
        -8192                0000
        
        8191                 7F7F
        
        2048                 5000
        
        -4096                2000
        

        解码功能

        你的解码函数应该在输入上接受两个字节,两者都在[0x00..0x7F]范围内并重新组合它们以返回[-8192 .. + 8191]之间的相应整数

        这是我的编码功能,它可以产生正确的结果。

            public static string encode(int num)
            {
                string result = "";
        
                int translated = num + 8192;
        
                int lowSevenBits = translated & 0x007F; // 0000 0000 0111 1111
        
                int highSevenBits = translated & 0x3F80; // 0011 1111 1000 0000
        
                int composed = lowSevenBits + (highSevenBits << 1);
        
                result = composed.ToString("X");
        
                return result;
            }
        

        我的解码函数需要帮助,它当前没有产生正确的结果,解码函数在0x00和0x7F范围内取两个十六进制字符串,将它们组合并返回解码后的整数。 在我的解码功能中,我试图扭转我在编码函数中所做的事情。

            public static short decode(string loByte, string hiByte)
            {
                byte lo = Convert.ToByte(loByte, 16);
                byte hi = Convert.ToByte(hiByte, 16);
        
                short composed = (short)(lo + (hi >> 1));
        
                short result = (short)(composed - 8192);
        
                return result;
            }
        

1 个答案:

答案 0 :(得分:1)

解码时,您正在尝试向右移位字节值(00-7F)。这将产生较小的值(00-3F)。相反,你应该将它向左移7位,以产生更高的值(0000-3F80)。然后可以将该值与低位组合以产生所需的值。

public static short decode(string loByte, string hiByte)
{
    byte lo = Convert.ToByte(loByte, 16);
    byte hi = Convert.ToByte(hiByte, 16);

    short composed = (short)(lo + (hi << 7));

    short result = (short)(composed - 8192);

    return result;
}