Я начинающий энтузиаст и некоторое время изучаю проблему в своем коде. Мой код уродлив и неэффективен, потому что я неопытен. Тем не менее, мне это нравится.Учитывая, что строка преобразуется в hex в 4-байтовых фрагментах ... C#
Проблема: с учетом строки я могу успешно преобразовать в шестнадцатеричный. Тем не менее, я хочу, чтобы данная строка (несмотря на ее длину) была преобразована в 4-байтовые фрагменты в Hex. В ситуациях, когда строка больше байта, но меньше 4-байтов, я хотел бы добавить «0» справа от строки. Я нахожу, что у меня только частичный успех, пока я манипулирую параметром totalWidth для метода PadRight. Как я могу достичь того, что ищу, не имея лишних кусков с нулевым значением в них?
Пожалуйста, смотрите точный образец кода я использую ниже:
// create a char array using the string provided to the encoder method
char[] arrayCharValues = strMessage.ToCharArray();
// create stringbuilder object
StringBuilder sb = new StringBuilder();
// iterate through each char and convert it to int32 then to Hex then append to stringbuilder object.
foreach (char c in arrayCharValues)
{
// convert char to int32
int intCharToNumVal = Convert.ToInt32(c);
// convert int32 to hex
string strNumToHexVal = String.Format("{0:X2}", intCharToNumVal);
// append hex value to string builder object
sb.Append(strNumToHexVal);
}
string s = sb.ToString();
if (s.Length % 8 == 0)
{
var list = Enumerable
.Range(0, s.Length/8)
.Select(i => s.Substring(i * 8, 8))
.ToList();
var res = string.Join(" ", list);
// DEBUG: echo results for testing.
Console.WriteLine("");
Console.WriteLine("String provided: {0}", strMessage);
Console.WriteLine("String provided total length: {0}", s.Length);
Console.WriteLine("Hex equivalent of string provided: {0}", sb.ToString());
Console.WriteLine("Hex in 8-digit chunks: {0}", res.ToString());
Console.WriteLine("======================================================");
}
else
{
int intDivisibleByEight = s.Length % 8;
int intPadRight = (8 - intDivisibleByEight)/2;
char pad = '0';
//BUG: doesn't know how to handle anything over 16 bits. If I use an input string of "coolsssss" i get 636F6F6C 73737373 73000000 00000000
//BUG: <cont'd> if i use the same input string and change the PadRight(32,pad) to PadRight(16,pad) i get 636F6F6C 73737373 and the final chunk is ignored.
//BUG: <cont'd> I want it to work as it does with the PadRight(32, pad) method but, I want it to ignore the all zeros chunk(s) that may follow.
//NOTE: int totalWidth = the number of characters i nthe resulting string, equal to the number of original characters plus any additional padding characters.
s = s.PadRight(32, pad);
var list = Enumerable
.Range(0, s.Length/8)
.Select(i => s.Substring(i * 8, 8))
.ToList();
var res = string.Join(" ", list);
// DEBUG: echo results for testing.
Console.WriteLine("");
Console.WriteLine("String provided: {0}", strMessage);
Console.WriteLine("String provided total length: {0}", s.Length);
Console.WriteLine("Hex equivalent of string provided: {0}", sb.ToString());
Console.WriteLine("Hex in 8-digit chunks: {0}", res.ToString());
Console.WriteLine("======================================================");
}
Почему бы не поместить свою строку ввода, прежде чем преобразовать ее? Тогда ваша функция конвертера может просто предположить, что все строки будут краткими (например, 8), и вам не придется беспокоиться о таких разбиениях кода. –
Спасибо за подсказку. Я попробую это, а также пример, приведенный ниже. –