Где заполнены переменные $ 1, $ 2 и $ 3?
Ваше регулярное выражение работает нормально, см. Этот код:
$temp = "toLocRobo_2019-01-30"
$regex = [regex]::Matches($temp, '([0-9]+)-([0-9]+)-([0-9]+)')
$regex.groups[0].value
$regex.groups[1].value
$regex.groups[2].value
$regex.groups[3].value
Существует созданный в методе для этого:
byte[] data = { 1, 2, 4, 8, 16, 32 };
string hex = BitConverter.ToString(data);
Результат: 01-02-04-08-10-20
, Если Вы хотите это без тире, просто удалите их:
string hex = BitConverter.ToString(data).Replace("-", string.Empty);
Результат: 010204081020
, Если Вы хотите более компактное представление, можно использовать Base64:
string base64 = Convert.ToBase64String(data);
Результат: AQIECBAg
Поскольку другие сказали, что это зависит от кодирования значений в массиве байтов. Несмотря на это необходимо быть очень осторожными с этим видом вещи, или можно попытаться преобразовать байты, которые не обрабатываются выбранным кодированием.
Jon Skeet имеет хорошая статья о кодировании и unicode в.NET. Рекомендуемое чтение.
Необходимо знать кодирование строки, представленной в байтах, но можно сказать System.Text.UTF8Encoding.GetString(bytes)
или System.Text.ASCIIEncoding.GetString(bytes)
. (Я делаю это из памяти, таким образом, API не может быть точно корректным, но это очень близко.)
Для ответа на Ваш второй вопрос, см. этот вопрос .
Хорошо я не преобразовываю байты для преобразовывания в шестнадцатеричную систему часто, таким образом, я должен сказать, что не знаю, существует ли лучший путь тогда это, но здесь является способом сделать это.
StringBuilder sb = new StringBuilder();
foreach (byte b in myByteArray)
sb.Append(b.ToString("X2"));
string hexString = sb.ToString();
Шестнадцатеричное число, Linq-fu:
string.Concat(ba.Select(b => b.ToString("X2")).ToArray())
ОБНОВЛЕНИЕ с временами
, Как отмечено @RubenBartelink, код, которые не имеют преобразования IEnumerable<string>
к массиву: ba.Select(b => b.ToString("X2"))
не работает до 4,0, тот же код теперь работает над 4,0.
Этот код...
byte[] ba = { 1, 2, 4, 8, 16, 32 };
string s = string.Concat(ba.Select(b => b.ToString("X2")));
string t = string.Concat(ba.Select(b => b.ToString("X2")).ToArray());
Console.WriteLine (s);
Console.WriteLine (t);
... до.NET 4.0, вывод:
System.Linq.Enumerable+<CreateSelectIterator>c__Iterator10`2[System.Byte,System.String]
010204081020
На.NET 4.0 вперед, строка. Concat имеет перегрузку, которая принимает IEnumerable. Следовательно на 4,0, вышеупомянутый код будет иметь тот же вывод для обеих переменных s, и t
010204081020
010204081020
До 4,0, ba.Select(b => b.ToString("X2"))
идет для перегрузки (object arg0)
, путь к IEnumerable<string>
для движения в надлежащую перегрузку, т.е. (params string[] values)
, мы должны преобразовать IEnumerable<string>
в массив строк. До 4,0, строка. Concat имеет 10 функций перегрузки, на 4,0 это теперь 12
Вы комбинируете LINQ со строковыми методами:
string hex = string.Join("",
bin.Select(
bin => bin.ToString("X2")
).ToArray());