我正在与需要使用十六进制将密码嵌入命令中的设备通信。密码必须为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。如果该问题中的其他答案之一确实是涵盖了这一点,这至少提出了对问题的答案,而直接提出了被问问题。我打算研究一下变化,对链接的问题的回答就浮现在脑海。如果此站点旨在促进学习,那么我们将无法涵盖所有内容,因为答案变得太复杂而无法帮助外行学习。
答案 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;
}