从 Int 到 Hex 的 14 位编码/解码,反之亦然
Encoding / Decoding 14-bit from Int to Hex and vice versa
所以我有这个问题要解决:
编写一个包含一对函数的小程序
将整数转换为特殊的文本编码,然后
将编码值转换回原始整数。
编码函数
此函数需要接受 14 位范围内的有符号整数 [-8192..+8191] 和 return 4 个字符的字符串。
编码过程如下:
原始值加上8192,所以它的范围被翻译成[0..16383]
将该值打包成两个字节,以便清除每个字节的最高有效位
未编码的中间值(作为 16 位整数):
00HHHHHH HLLLLLLL
编码值:
0HHHHHHH 0LLLLLLL
- 将这两个字节格式化为一个 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;
}
所以我有这个问题要解决:
编写一个包含一对函数的小程序
将整数转换为特殊的文本编码,然后
将编码值转换回原始整数。
编码函数
此函数需要接受 14 位范围内的有符号整数 [-8192..+8191] 和 return 4 个字符的字符串。
编码过程如下:
原始值加上8192,所以它的范围被翻译成[0..16383]
将该值打包成两个字节,以便清除每个字节的最高有效位
未编码的中间值(作为 16 位整数):
00HHHHHH HLLLLLLL
编码值:
0HHHHHHH 0LLLLLLL
- 将这两个字节格式化为一个 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;
}