2016-10-23 32 views
0

所以我有这个问题解决:编码/解码来自INT 14位到十六进制,并且反之亦然

写一个小程序,包括对功能,可以

  1. 将整数转换一个特殊的文本编码,然后

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

的编码功能

此功能需要在14位范围以接受一个带符号的整数[-8192 .. + 8191],并返回一个4个字符的字符串。

编码过程如下:

  1. 添加到8192的原始值,因此它的范围被转换成[0..16383]

  2. 包该值装入两个字节,使得每个最显著位被清零

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

00HHHHHH HLLLLLLL 

编码值:

0HHHHHHH 0LLLLLLL 
  • 格式的两个字节作为一个单一的4字符十六进制字符串并返回它。
  • 示例值:

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

    解码功能

    你的解码功能应该接受输入的两个字节,无论是在范围[0x00..0x7F]和重新组合它们返回相应的整数[-8192 .. + 8191]


    这是m y 编码函数工作,它会产生正确的结果。

    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

    你已经说过,你需要解码函数的帮助,但是你已经进入了很多不相关的细节,并没有真正描述它的问题。 http://stackoverflow.com/help/mcve –

    +0

    @AdrianWragg谢谢,我更新了我的问题 –

    回答

    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; 
    } 
    
    +0

    谢谢,这很有道理。 –

    相关问题