【问题标题】:I need to calculate a hex string based on a ASCII string value我需要根据 ASCII 字符串值计算十六进制字符串
【发布时间】:2019-05-20 15:10:54
【问题描述】:

我正在与需要使用十六进制将密码嵌入命令的设备进行通信。密码必须为 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 34 35。如果该问题中的其他答案之一确实如此涵盖这一点,这至少提供了直接提出问题的问题的答案。我打算研究一下位移,链接问题的答案就在我的脑海中飞过。如果这个网站旨在促进学习,那么我们就不能有一个包罗万象的部分,因为答案太复杂,无法帮助外行学习。

【问题讨论】:

  • 将字符转换为整数,然后您可以使用按位或操作组合两个整数。 byte foo = (digit1 << 4) | (digit2 & 0xF);
  • 如果密码中有非数字字符怎么办?
  • Jeroen,我不同意,这是不同的,因为输入是 ascii,我没有将简单的 ascii 字符转换为字节。
  • 谢谢 itsme86。现在试一试。一旦我完成了这项工作,我将为其他有类似问题的人发布源代码。

标签: c# .net-cf-3.5


【解决方案1】:

非常感谢 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;
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-07-27
    • 2014-03-07
    相关资源
    最近更新 更多