所以我要解决这个问题:
编写一个包含一对
功能的小程序将整数转换为特殊文本编码,然后
将编码值转换回原始整数。
编码功能
此函数需要接受14位范围内的有符号整数[-8192 .. + 8191]并返回4个字符的字符串。
编码过程如下:
将8192添加到原始值,因此其范围转换为[0..16383]
将该值打包成两个字节,以便清除每个字节的最高位
未编码的中间值(作为16位整数):
00HHHHHH HLLLLLLL
编码值:
0HHHHHHH 0LLLLLLL
示例值:
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;
}
答案 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;
}