我需要根据ASCII字符串值计算一个十六进制字符串

时间:2019-05-20 15:10:54

标签: c# .net-cf-3.5

我正在与需要使用十六进制将密码嵌入命令中的设备通信。密码必须为8个字节。如果ASCII数字密码小于16位数字,则密码用F填充。

例如,如果密码为12345,我需要能够将密码转换为0x12 0x34 0x5F 0xFF 0xFF 0xFF 0xFF 0xFF。

我不确定该怎么做是从“ 12”中获取0x12。

我在考虑是否可以将1转换为0x10,将2转换为0x02,然后可以将两个字节加在一起得到0x12。但是,有没有一种方法无需创建哈希表就可以获取0x10和0x02,还是有更好的方法?

编辑:对任何粗鲁无礼的人。这是一个独特的问题,我不是,想简单地获取十六进制值12345,以十六进制表示为31 32 33 3435。如果该问题中的其他答案之一确实是涵盖了这一点,这至少提出了对问题的答案,而直接提出了被问问题。我打算研究一下变化,对链接的问题的回答就浮现在脑海。如果此站点旨在促​​进学习,那么我们将无法涵盖所有​​内容,因为答案变得太复杂而无法帮助外行学习。

1 个答案:

答案 0 :(得分:2)

非常感谢Itisme86。 =)基于上述Itisme86的帮助,我将以下代码放在一起进行转换。这是在运行代码之前进行的错误处理和强制格式。

    internal string FormatPassword(string password)
    {
        string formattedPassword = string.Empty;

        for (int pos = 0; pos < password.Length; pos+=2)
        {
            string partialPassword = string.Empty;
            if (password.Length > pos + 1)
            {
                partialPassword = GetPasswordByte(password.Substring(pos, 2));
            }
            else
            {
                partialPassword = GetPasswordByte(password.Substring(pos, 1));
            }

            if (!string.IsNullOrEmpty(partialPassword))
            {
                formattedPassword += partialPassword;
            }
        }

        if (formattedPassword.Length < 8)
        {
            formattedPassword = formattedPassword.PadRight(8, (char)0xFF);
        }

        return formattedPassword;
    }

    internal string GetPasswordByte(string partialPassword)
    {
        string byteString = string.Empty;

        int digit1 = Convert.ToInt16(partialPassword.Substring(0, 1));
        int digit2 = 15;
        if (partialPassword.Length > 1)
        {
            digit2 = Convert.ToInt16(partialPassword.Substring(1, 1));
        }
        byte[] passwordByte = BitConverter.GetBytes((digit1 << 4) | (digit2 & 0xF));
        byteString = System.Text.Encoding.Default.GetString(passwordByte, 0, 1);

        return byteString;
    }