Преобразование байта 10
даст один символ, а не 2 символа. Ваш метод обратного преобразования (логически) основан на 2 символах на байт.
этот случай работает
byte[] binary1 = new byte[] { 100 }; // convert will result in "64"
и этот случай не удается
byte[] binary1 = new byte[] { 10 }; // convert will result in "a"
Я быстро исправил ваш код, добавив "0"
в случае одного символа.
рабочий код:
byte[] binary1 = new byte[] { 100 };
string hexString = "";
int counter1 = 0;
foreach (byte b in binary1)
{
counter1++;
var s = (Convert.ToString(b, 16));
// new
if (s.Length < 2)
{
hexString += "0";
}
// end new
hexString += s;
}
List<byte> bytelist = new List<byte>();
int counter2 = 0;
for (int i = 0; i < hexString.Length / 2; i++)
{
counter2++;
string ch = hexString.Substring(i * 2, 2);
var item = Convert.ToByte(ch, 16);
bytelist.Add(item);
}
byte[] binary2 = bytelist.ToArray();
Обратите внимание, что ваш код может использовать рефакторинг, например, не зацикливайте concat в цикле и, возможно, проверьте принцип единой ответственности.
Обновление, исправлено, но здесь есть лучшие решения: Как преобразовать байтовый массив в шестнадцатеричную строку и наоборот?