用十六进制理解位/字节

时间:2011-12-20 05:29:01

标签: c#

我无法弄清楚这是怎么发现的。我想了解这个人是如何找到这些东西以及如何在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);
}

1 个答案:

答案 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