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

Encoding / Decoding 14-bit from Int to Hex and vice versa

所以我有这个问题要解决:

编写一个包含一对函数的小程序

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

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

编码函数

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

编码过程如下:

  1. 原始值加上8192,所以它的范围被翻译成[0..16383]

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

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

00HHHHHH HLLLLLLL

编码值:

0HHHHHHH 0LLLLLLL
  1. 将这两个字节格式化为一个 4 字符的十六进制字符串,然后 return 它。

示例值:

Unencoded (decimal)  Encoded (hex)

0                    4000

-8192                0000

8191                 7F7F

2048                 5000

-4096                2000

解码函数

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


这是我的 encoding 函数,它可以产生正确的结果。

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

我的 decoding 函数需要帮助,它目前没有产生正确的结果,解码函数采用两个十六进制字符串,每个字符串都在 0x00 和 0x7F 范围内,将它们组合起来returns 解码后的整数。 在我的解码函数中,我试图反转我在编码函数中所做的事情。

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

解码时,您正在尝试将字节值 (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;
}