Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.60/25: Рейтинг темы: голосов - 25, средняя оценка - 4.60
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
1

Как получить HEX строку из byte?

28.12.2015, 00:18. Показов 4635. Ответов 38
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что - то вообще не работает...

C++
1
2
3
4
5
6
7
8
9
10
void ByteToHex(char Hex[], byte Sourse[])
{
    char const hex_chars[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'};
 
    for(int j = 0, i = 0; i < 20; ++i)
    {
        Hex[j++] += hex_chars[(Sourse[i] & 0xF0) >> 4];
        Hex[j++] += hex_chars[(Sourse[i] & 0x0F) >> 0];
    }
}
Где - то видел без всяких букв, вроде

C++
1
for(int i = 0; i < 20; ++i) cout << (Sourse[] << 16) << (Sourse[] << 8);
И кто может объяснить, чем отличается byte от char?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2015, 00:18
Ответы с готовыми решениями:

Перевести char* или byte* в Hex-строку
Собственно сабж. А ситуация такая: Есть функция принимающая толи char* толи BYTE* и мне нужно...

Byte to Hex
Подскажите пожалуйста, провожу данные BYTE через функцию, которая конвентирует в HEX, не всегда но...

Преобразование из HEX в BYTE
Теперь у меня есть массив (строка) с хекскодами и я хочу ее преобразовать в BYTE, нашел вот такую...

Hex (3 byte) to Float
С внешнего устройства приходят данные 40 00 00, 40 80 00, 7F FF FF и тп. Известно, что 7 бит...

38
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 01:25  [ТС] 21
Author24 — интернет-сервис помощи студентам
Ааа...Блин, проглядел, взял код с джавы

Добавлено через 2 минуты
А TCHAR это не char ?
0
393 / 165 / 32
Регистрация: 10.12.2015
Сообщений: 717
28.12.2015, 01:31 22
псевдоним, который всегда может поменяться.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 01:49  [ТС] 23
Обратно только что - то не очень, одни ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void Hex2Byte(char lpBuff[], byte bValue[])
{
    char const hex_chars[] = "0123456789abcdef";
 
    int size = strlen((char *)bValue);
    byte b = malloc(size);
    int i = -1;
 
    while(++i < 16) b[hex_chars[i]] = i;
 
    i = 0;
    
    while (i in lpBuff) bValue[i] = 16 * b[lpBuff[i]] + b[lpBuff[i += 1]];
}
Кликните здесь для просмотра всего текста
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
function tohexarray(str)
{
    var s = '0123456789ABCDEF'
    var ht = {}
 
    for (var i = 0; i < 16; i++) ht[s[i]] = i
 
    var a = str.split(' ') // Пробелами не буду баловаться, так, что дальше а = str
 
    for (var i in a) a[i] = 16 * ht[a[i][0]] + ht[a[i][1]]
 
    return a
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 06:30 24
C++
1
2
3
4
5
6
7
8
9
10
11
void Hex2Byte(char lpBuff[], byte bValue[])
{
    unsigned n;
    std::string s = lpBuff;
    for (size_t i = 0, j = 0; i < s.length(); i += 2, ++j)
    {
        std::istringstream iss(s.substr(i, 2));
        iss >> std::hex >> n;
        bValue[j] = n;
    }
}
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 15:00  [ТС] 25
Дак я из -за ошибок в iomanip не стал использовать:
C++
1
2
3
4
5
6
7
void Byte2Hex(byte bValue[], char lpBuff[])
{
    std::wostringstream oss;
    for(int i = 0; i < длина bValue; ++i) oss << std::hex << std::setw(2) << std::setfill('0') << static_cast<unsigned>(bValue[i]);
    std::copy(lpBuff, длина чего - то, bValue);
    //strcpy(lpBuff, oss.str());
}
Ошибка C2338 wrong character type for setfill AES Uncript d:\programs\microsoft visual studio 2015\vc\include\iomanip 60
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 15:42 26
Так попробуй:
C++
1
std::setfill(L'0')
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:08  [ТС] 27
А как строку скопировать?

C++
1
2
3
В 1м варианте, я вообще синтаксиса не понял, во 2м не знаю как oss в char вывести:
std::copy(lpBuff, длина чего - то, bValue);
//strcpy(lpBuff, oss.str());
Добавлено через 20 минут
C++
1
2
3
4
5
6
void Byte2Hex(byte bValue[], char lpBuff[])
{
    std::wostringstream oss;
    for(int i = 0; i < sizeof(bValue); ++i) oss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<unsigned>(bValue[i]);
    strcpy_s(lpBuff, sizeof(lpBuff),(char *)oss.str().c_str());
}
1 букву e выдаёт...
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 16:31 28
Почему у тебя так много лишнего?
C++
1
strcpy(lpBuff, oss.str().c_str());
0
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:38  [ТС] 29
Не знаю, я вообще ничего не понимаю в стдл, и не только...
Чем дальше в С, тем тупее себя чувствую...

C++
1
(char *)oss.str().c_str()
- проверил в этом проблема...
C++
1
sizeof(bValue)
Не будет же работать здесь?
C++
1
void Byte2Hex(byte bValue[], char lpBuff[])
Неизвестная длина массива...

Может нужно так:
C++
1
void Byte2Hex(byte bValue, char lpBuff)
Или так?
C++
1
void Byte2Hex(byte * bValue, char * lpBuff)
Добавлено через 2 минуты
Вот в павне, когда передаёшь массив неопределённой длинны, нужно передать ешё и его размер, иначе никак...

Типа того:
C++
1
2
3
4
5
6
void Byte2Hex(byte bValue[], size_t bSize, char lpBuff[], size_t cSize)
{
    std::wostringstream oss;
    for(int i = 0; i < bSize; ++i) oss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<unsigned>(bValue[i]);
    strcpy_s(lpBuff, cSize, (char *)oss.str().c_str());
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 16:40 30
В той теме посмотри. Ты постоянно меняешь тип строки. Если для древнего char делать, то std::ostringstream, а если для wchar_t, то std::wostringstream.
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:42  [ТС] 31
Понял, спасибо.
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 16:44 32
sizeof() вообще не работает для строк. Только для массива целиком, если он объявлен там же.

Добавлено через 1 минуту
Вот так:
C++
1
2
3
4
5
6
void Byte2Hex(byte bValue[], size_t bSize, wchar_t *lpBuff)
{
    std::wostringstream oss;
    for(int i = 0; i < bSize; ++i) oss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<unsigned>(bValue[i]);
    wcscpy(lpBuff, oss.str().c_str());
}
Тебе вообще не нужна длина этой строки. Не используй эти нестандартные функции с "_s".
1
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:45  [ТС] 33
Так вс сам навязывает, говорит они безопаснее...
Хотя я не собираюсь записывать в строку с размером 10, 20символов...
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 16:47 34
И ты сразу послушался? Они не соответствуют стандарту и только путают всё.
0
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:51  [ТС] 35
Это в свойствах проекта уровень предупреждений изменить?
0
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 16:58  [ТС] 36
Не даёт скомпилировать, пишет что это ошибка, использовать без _s...
Как получить HEX строку из byte?
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 17:40 37
SDL убери.
0
100 / 35 / 21
Регистрация: 17.09.2014
Сообщений: 1,599
28.12.2015, 19:38  [ТС] 38
Наконец, то до меня дошло.
Я понял что мне нужно

char вообще не нужен.
Всё в wchar_t.
sha1 который в byte вывести в окно ввода в 16й системе.
А так же прочитать в 16й текст в окне, и засунуть его в byte.

1 ошибка в >>
C++
1
iss >> std::hex >> n;
Ошибка (активно) отсутствует оператор ">>", соответствующий этим операндам
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
#include <windows.h>
#include <iostream>
#include <sstream>
#include <iomanip>
 
void Byte2HexW(byte bValue[], size_t bSize, wchar_t * lpBuff) // В двухбайтовую строку
{
    std::wostringstream oss;
    for (int i = 0; i < bSize; ++i) oss << std::hex << std::setw(2) << std::setfill(L'0') << static_cast<unsigned>(bValue[i]);
    wcscpy(lpBuff, oss.str().c_str());
}
void HexW2Byte(wchar_t lpBuff[], byte bValue[]) // Из двухбайтовой строки
{
    unsigned n;
    std::wstring s = lpBuff;
    for(size_t i = 0, j = 0; i < s.length(); i += 2, ++j)
    {
        std::wostringstream iss(s.substr(i, 2));
        iss >> std::hex >> n;
        bValue[j] = n;
    }
}
 
int main(int argc, char ** argv)
{
    setlocale(LC_ALL, "Russian");
 
    byte result[72] = // Это какая - то строка...
    {
        0xd0, 0xa2, 0xd0, 0xb5, 0xd0, 0xba, 0xd1, 0x81, 0xd1, 0x82, 0x20, 0xd0, 0xbf, 0xd1, 0x80, 0xd0,
        0xbe, 0xd1, 0x81, 0xd1, 0x82, 0xd0, 0xbe, 0xd0, 0xb9, 0x2c, 0x20, 0x65, 0x6e, 0x67, 0x6c, 0x69,
        0x73, 0x68, 0x2c, 0x20, 0x31, 0x32, 0x33, 0x34, 0x35, 0x2c, 0x20, 0xe4, 0xba, 0x8b, 0xe5, 0xa5,
        0x89, 0xe8, 0x81, 0x96, 0xe7, 0xa6, 0xae, 0xe9, 0x87, 0x8b, 0x20, 0x2d, 0x20, 0xd0, 0xba, 0xd0,
        0xbe, 0xd0, 0xbd, 0xd0, 0xb5, 0xd1, 0x86, 0x2e
    };
    wchar_t wHex[72 * 2 + 1]; Byte2HexW(result, 72, wHex); // В однобайтовую строку из byte
    byte bValue[72]; HexW2Byte(wHex, bValue); // Из однобайтовой строки в byte
 
    std::wcout << "Это многобайтовая строка hex : " << wHex << std::endl << "Это вообще не строка, byte : " << bValue << std::endl;
 
    system("pause");
}
0
7793 / 6560 / 2984
Регистрация: 14.04.2014
Сообщений: 28,672
28.12.2015, 21:59 39
Там std::wistringstream.
1
28.12.2015, 21:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.12.2015, 21:59
Помогаю со студенческими работами здесь

Преобразовать BYTE в HEX
Я читаю содержимое файла в BYTE и потом хочу вывести его в editbox, но сначала мне нужно...

Вывести в окно программы hex массив byte
Вот есть массив: byte AESKey; Он уже заполнен, как мне вывести в консоль в 16м виде весь этот...

Как перевести строку в hex и обратно?
Немогу найти в гугле функцию какбы перевести строку в hex и обратно, мб у кого завалялась?

Как получить из двух byte один int?
Собственно вот, есть две переменные byte byte b1 = 0x03; byte b2 = 0x40; надо получить...


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

Или воспользуйтесь поиском по форуму:
39
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru