我无法弄清楚这是怎么发现的。我想了解这个人是如何找到这些东西以及如何在C#中自动完成它(有助于理解它,但也获得代码)。此处所在的主题为http://forums.radioreference.com/project-25-technologies/228247-p25-control-messages.html,帖子为Post #8。请帮我理解字节和位。十六进制代码(我相信是十六进制)的格式如下:警察扫描仪:
P25:T0001:80000400FD0008001B5F3A09
论坛的引用如下(上面的每两个都是一个八字组叫做)
80 00 04 00 FD 00 08 00 1B 5F 3A 09
-
取第一个字节的低6位(字节0)给出一个值0,这是一个组语音授权
第二个字节是制造商ID。值00是标准包
Talkgroup ID是字节5& 6。
无线电ID是字节7,8和& 9
字节10& 11是16位CRC。
我目前的代码给了我以下输出,这似乎不正确。无线电ID是7007,我看不到字节7,8,9(08 00 1B)是如何获得7007的。
128(0),0(0),4(4),0(0),253(61),0(0),8(8),0(0),27(27),95( 31),58(58),9(9)
我不知道这个代码到底是什么:
String SelectedText = lstboxMessages.SelectedItem.ToString();
String[] SplittedText = SelectedText.Replace("\\r\\n", "").Replace("\r\n", "").Split(new String[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
int[] Octets = new int[12];
SplittedText[2] = "80000400FD0008001B5F3A09";
Octets[0] = Convert.ToInt32(SplittedText[2].Substring(0, 2), 16);
Octets[1] = Convert.ToInt32(SplittedText[2].Substring(2, 2), 16);
Octets[2] = Convert.ToInt32(SplittedText[2].Substring(4, 2), 16);
Octets[3] = Convert.ToInt32(SplittedText[2].Substring(6, 2), 16);
Octets[4] = Convert.ToInt32(SplittedText[2].Substring(8, 2), 16);
Octets[5] = Convert.ToInt32(SplittedText[2].Substring(10, 2), 16);
Octets[6] = Convert.ToInt32(SplittedText[2].Substring(12, 2), 16);
Octets[7] = Convert.ToInt32(SplittedText[2].Substring(14, 2), 16);
Octets[8] = Convert.ToInt32(SplittedText[2].Substring(16, 2), 16);
Octets[9] = Convert.ToInt32(SplittedText[2].Substring(18, 2), 16);
Octets[10] = Convert.ToInt32(SplittedText[2].Substring(20, 2), 16);
Octets[11] = Convert.ToInt32(SplittedText[2].Substring(22, 2), 16);
String strSpecial = Convert.ToString(Convert.ToInt32(SplittedText[2].Substring(0, 2), 16), 2).PadLeft(8, '0');
String binOpCode = strSpecial.Substring(2, 6);
int OpCode = Convert.ToInt32(binOpCode, 2);
String strReturnMessage = ""; //= SplittedText[2] + " = ";
for (int i = 0; i < Octets.Count(); i++)
{
if (i != 0)
{
strReturnMessage += ", ";
}
strReturnMessage += Convert.ToString(Octets[i]);
strReturnMessage += " (" + BinaryToInt(Convert.ToString(Convert.ToInt32(SplittedText[2].Substring((i * 2), 2), 16), 2).PadLeft(8, '0')).ToString() + ")";
}
txtLastMessage.Text = strReturnMessage;
和BitToInt()是
private int BinaryToInt(String strBinary)
{
String binOpCode = strBinary.Substring(2, 6);
return Convert.ToInt32(binOpCode, 2);
}
答案 0 :(得分:3)
如果您正在询问如何手动将十六进制转换为十进制:
好的,请001B5F
。正如十进制数字一样,可以剥离前导零:1B5F
。现在,让我们按基地排列:
1 B 5 F
4096 256 16 1
到目前为止?十进制数的等效值为1,100,1000等,但这是16的基数,因此每个数字上升16倍。
现在,您的十六进制数字是:
0 1 2 3 4 5 6 7 8 9 A B C D E F
在十进制转换中是等价的:
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
因此,替换并乘以:1*4096 + 11*256 + 5*16 + 15
,它会为您提供7007
。
在代码中,这更容易,因为您不需要手动执行。有许多方法可以做到这一点,但我会限制自己来回一次:</ p>
int x = 33;
string hex = x.ToString("X2"); // becomes hex 21
然后又回来了:
int y = Convert.ToInt32(hex, 16); // y is 33