Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/29: Рейтинг темы: голосов - 29, средняя оценка - 4.86
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218

Не удается преобразовать из "string" в "Byte[]"

06.10.2015, 13:31. Показов 5863. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.
Есть хэширование SHA1.
Но, в строчке string hash = sha1.Hash(text); выбивает подобную ошибку:
"Не удается преобразовать из "string" в "Byte[]""
Можно просто преобразовать, но не уверен что это будет правильно.
Прошу помощи! Заранее спасибо!

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
 
namespace ConsoleApplication5
{
    class Program
    {
        static void Main(string[] args)
        {
            //var text = args[0];
            string text = "Николай";
            string hash = sha1.Hash(text);
            Console.WriteLine("Хэшированное слово:\n{0}", hash);
            Console.ReadLine();
        }
    }
 
    static class sha1
    {
        static byte[] pad(byte[] mes)
        {
            byte[] newMes = new byte[((mes.LongLength * 8 + 512 - 447) / 512 + 1) * 512 / 8];
            for (long i = 0; i < mes.LongLength; i++)
            {
                newMes[i] = mes[i];
            }
            newMes[mes.LongLength] = (1 << 7);
            ulong l = (ulong)mes.LongLength * 8;
            for (int i = 0; i < 8; i++)
            {//write l to end of padding
                newMes[newMes.LongLength - i - 1] = (byte)(l >> (i * 8));
            }
            return newMes;
        }
 
        static uint ch(uint x, uint y, uint z)
        {
            return (x & y) ^ ((~x) & z);
        }
 
        static uint parity(uint x, uint y, uint z)
        {
            return x ^ y ^ z;
        }
 
        static uint maj(uint x, uint y, uint z)
        {
            return (x & y) ^ (x & z) ^ (y & z);
        }
 
        static uint ft(uint x, uint y, uint z, int t)
        {
            if (t <= 19)
                return ch(x, y, z);
            if (t <= 39)
                return parity(x, y, z);
            if (t <= 59)
                return maj(x, y, z);
            return parity(x, y, z);
        }
 
        static uint rotl(uint a, int n)
        {
            return (a << n) | (a >> (32 - n));
        }
 
        static uint kt(int t)
        {
            if (t <= 19)
                return 0x5a827999;
            if (t <= 39)
                return 0x6ed9eba1;
            if (t <= 59)
                return 0x8f1bbcdc;
            return 0xca62c1d6;
        }
 
        static uint wt(byte[] mes, int i, int t)
        {
            if (t <= 15)
                return mes.Skip(i * 512 / 8 + t * 4).Take(4).Aggregate((uint)0, (cur, next) =>
                    (cur << 8) | next);
            return rotl(wt(mes, i, t - 3) ^ wt(mes, i, t - 8) ^ wt(mes, i, t - 14) ^
                wt(mes, i, t - 16), 1);
        }
 
        public static uint[] Hash(byte[] mes)
        {
            mes = pad(mes);
            uint a = 0x67452301;
            uint b = 0xefcdab89;
            uint c = 0x98badcfe;
            uint d = 0x10325476;
            uint e = 0xc3d2e1f0;
 
            for (int i = 0; i < mes.LongLength / 64; i++)
            {
                uint a1 = a;
                uint b1 = b;
                uint c1 = c;
                uint d1 = d;
                uint e1 = e;
 
                for (int t = 0; t <= 79; t++)
                {
                    uint T = rotl(a, 5) + ft(b, c, d, t) + e + kt(t) + wt(mes, i, t);
                    e = d;
                    d = c;
                    c = rotl(b, 30);
                    b = a;
                    a = T;
                }
                a += a1;
                b += b1;
                c += c1;
                d += d1;
                e += e1;
            }
 
            return new uint[] { a, b, c, d, e };
        }
    }
 
}
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
06.10.2015, 13:31
Ответы с готовыми решениями:

Не удается неявно преобразовать тип byte в string
Вообщем, добавил в проект файл: settings.json, где собираюсь в дальнейшем сохранять все настройки приложения. Но, после того как я...

Не удаётся неявно преобразовать тип string в byte[]
Добрый вечер. &quot;Позаимствовал&quot; код блочного шифра на C# для своей курсовой, оригинальный код консольный, переделал под Виндоус Формы. В 124...

Открытие Excel файла из ресурсов приложения. Ошибка: Не удается неявно преобразовать byte в string
private void button1_Click(object sender, EventArgs e) { Excel.Range Rng; ...

12
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
06.10.2015, 13:40
Konark, алгоримты хеширования работают с байтами. Нужно получить из строки байты для определенной кодировки и передать их в метод Hash. Хеш это тоже байты и если ты его хочешь показывать как строку, то нужно выполнить преобразование:
C#
1
2
3
string text = "Николай";
string hash = BitConverter.ToString(sha1.ComputeHash(Encoding.UTF8.GetBytes(text)));
Console.WriteLine("Хэшированное слово:\n{0}", hash);
0
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218
06.10.2015, 23:56  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Konark, алгоримты хеширования работают с байтами. Нужно получить из строки байты для определенной кодировки и передать их в метод Hash. Хеш это тоже байты и если ты его хочешь показывать как строку, то нужно выполнить преобразование:
Код C#Выделить код
1
2
3
string text = "Николай";
string hash = BitConverter.ToString(sha1.ComputeHash(E ncoding.UTF8.GetBytes(text)));
Console.WriteLine("Хэшированное слово:\n{0}", hash);
Я написал (тк. у меня нету функции "ComputeHash", а есть функция Hash):
C#
1
string hash = BitConverter.ToString(sha1.Hash(Encoding.UTF8.GetBytes(text)));
В итоге мне выбивает ошибку:
Аргумент 1: не удается преобразовать из "uint[]" в "byte[]".

В чем моя проблема?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
07.10.2015, 00:11
Потому что вы велосипед изобретаете. Используйте родной класс для SHA1.
0
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218
07.10.2015, 00:26  [ТС]
Цитата Сообщение от Someone007 Посмотреть сообщение
Потому что вы велосипед изобретаете. Используйте родной класс для SHA1.
Я бы рад, по заданию нельзя.
Поможете решить проблему?
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
07.10.2015, 00:29
Konark, я согласен с Someone007. Непонятно зачем ты решил заново реализовать SHA1 когда в .NET есть встроенная реализация. Но если для этого есть причина, то в каком виде ты хочешь вывести на экран 5 uint чисел?
0
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218
07.10.2015, 00:54  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Непонятно зачем ты решил заново реализовать SHA1 когда в .NET есть встроенная реализация.
В задании написано что нельзя пользоваться ними.

Цитата Сообщение от OwenGlendower Посмотреть сообщение
Но если для этого есть причина, то в каком виде ты хочешь вывести на экран 5 uint чисел?
Мне разве их в итоге нужно выводить на экран?
Мне нужно вывести хэшированное слово "Николай".
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
07.10.2015, 00:57
Цитата Сообщение от Konark Посмотреть сообщение
Мне разве их в итоге нужно выводить на экран?
Ты шутишь? Вызов Console.WriteLine("Хэшированное слово:\n{0}", hash) это и есть вывод на экран. Твой метод hash возвращает массив uint из 5 элементов. Вот я тебя и спрашиваю в каком виде ты хочешь вывести?
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
07.10.2015, 00:58
Цитата Сообщение от Konark Посмотреть сообщение
Мне нужно вывести хэшированное слово "Николай".
Эти 5 чисел как раз и представляют собой хэш того, что вы там хэшируете.
0
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218
07.10.2015, 01:07  [ТС]
Цитата Сообщение от OwenGlendower Посмотреть сообщение
Ты шутишь? Вызов Console.WriteLine("Хэшированное слово:\n{0}", hash) это и есть вывод на экран. Твой метод hash возвращает массив uint из 5 элементов. Вот я тебя и спрашиваю в каком виде ты хочешь вывести?
Это я вижу.
Но в каком смысле "в каком виде"?

Цитата Сообщение от Someone007 Посмотреть сообщение
Эти 5 чисел как раз и представляют собой хэш того, что вы там хэшируете.
Вообще я думал что вид хэшированного слова подобный:
a20446e428545c7e8321cb3deea65378a4f452b4
А unit как бы только цифры и только положительные.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,574
07.10.2015, 01:18
Цитата Сообщение от Konark Посмотреть сообщение
Вообще я думал что вид хэшированного слова подобный:
a20446e428545c7e8321cb3deea65378a4f452b4
Именно, массив из 20 байт. 5 чисел uint сколько байт? 20.

Code
1
a20446e4  28545c7e  8321cb3d  eea65378  a4f452b4
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18277 / 14200 / 5368
Регистрация: 17.03.2014
Сообщений: 28,881
Записей в блоге: 1
07.10.2015, 01:23
Лучший ответ Сообщение было отмечено Konark как решение

Решение

Цитата Сообщение от Konark Посмотреть сообщение
Вообще я думал что вид хэшированного слова подобный:
a20446e428545c7e8321cb3deea65378a4f452b4
Вот примерно такой ответ я и ожидал. Замени тип возвращаемого значения метода Hash на byte[] и вместо return напиши код:
C#
1
2
3
4
5
6
7
8
uint[] temp = new uint[] { a, b, c, d, e };
byte[] hash = new byte[temp.Length*sizeof(uint)];
Buffer.BlockCopy(temp, 0, hash, 0, hash.Length);
for (int i=0, j=0; i<temp.Length; i++, j+=sizeof(uint))
{
    Array.Reverse(hash, j, sizeof(uint));
}
return hash;
После этого в Main ты сможешь выполнить ранее приведенный код:
C#
1
2
3
string text = "Николай";
string hash = BitConverter.ToString(sha1.Hash(Encoding.UTF8.GetBytes(text)));
Console.WriteLine("Хэшированное слово:\n{0}", hash);
Добавлено через 1 минуту

Не по теме:

P.S. Ты точно сам этот класс написал? Потому что я не понимаю как человек написавший класс sha1 не в состоянии вывести массив на экран

1
 Аватар для Konark
5 / 5 / 3
Регистрация: 20.01.2012
Сообщений: 218
11.10.2015, 15:05  [ТС]
Спасибо огромное!)
Все работает.
Приделал еще визуальный режим к ней.

Я не говорил что я его сам написал)
Я сначала сделал со станд. функциями, но сказали что так не пойдет, нашел в интернете этот код.
И вывести массив я могу на экран
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.10.2015, 15:05
Помогаю со студенческими работами здесь

Не удается преобразовать int в byte
Не правильно как то записываю и ругается на ошибку, что не может преобразовать: private byte HWKeyGenerate(byte hwid) { ...

Преобразовать из string в byte[]
Такая проблема: у меня в textboxe записаны данные типа byte,конвертированные в string. Как вытащить их обратно?Чтобы то,что у меня в...

Преобразовать byte в string
Не писал давно на VB, но надо нарисовать форму, и затык с этим всем. Допустим, есть такой код Dim s As String Dim bRead As Long ...

Преобразовать String в byte
Есть устройство, которое принимает в качестве команд шестнадцатеричное число, число надо бы ввести через текстбокс и отправить. Сейчас я...

Преобразовать String в Byte
Возник такой вопрос, нужно преобразовать строку в байты, как это делает Encoding.ASCII.GetBytes на C#, мне нужен аналог только на Delphi....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru