Konwersja unsigned char* -> wstring -> unsigned char*

0

Witam.
Potrzebuję konwersji:


unsigned char* -> std::wstring -> unsigned char*

W tym przypadku dane wejściowe i wyjściowe są typu unsigned char, wstring pełni tylko rolę transportową.
Próbowałem różnych metod znalezionych w sieci, niestety nie działają. Czy ktoś zna sensowny sposób na taką konwersję?
Próbowałem także rzutować znak po znaku, ale przy konwersji na unsigned char
program czasem się wywala.

0

Za mało danych, albo nie rozumiem na czym polega problem.
Chcesz zmienić kodowanie?
Jeśli tak: to z jakiego na jakie?
Jeśli nie: to w czym problem, bo zwykł static_cast powinien załatwić sprawę.

0

Chodzi mi o to, żeby po podwójnej konwersji dostać takie same bajty.
Np. takie coś nie działa:


std::wstring bytesToWstring(unsigned char* bytes, int size) {
    std::wstring result;
    for (int i = 0; i < size; ++i) {
        result += static_cast<wchar_t>(bytes[i]);
    }
    return result;
}

std::string wstringToBytes(std::wstring wstr) {
    std::string s;
    for (int i = 0; i < wstr.size(); ++i) {
        s += static_cast<unsigned char>(wstr[i]);
    }
    return s;
}

Jak dałem zwracany typ unsigned char* to działał poprawnie, ale czasem się wywalał.

0

ale co jest w tych bajtach?
czy to zwykły c-string w systemowym kodowaniu, który niepotrzebnie ma unsigned w typie, czy to bajty w jakimś konkretnym kodowaniu, np. UTF-16, ...

i jaki to jest system, bo pod uniksami wstring/wchar_t przechowuje znaki w UCS-4, a pod Windowsem w UTF-16...

0

W bajtach nie ma żadnego kodowania, to sązwykłe unsigned char dla funkcji kryptograficznych. A później chcę to przesłać przez sieć, a biblioteka chce wstring.

0

Nie ma czegoś takiego jak "żadnego kodowania" albo "zwykłe unsigned char".

Chcesz dokonać niemożliwej operacji:

nieznane kodowanie —> znane kodowanie

a jeśli w bajtach nie ma żadnego sensownego tekstu, tylko dane binarne, to wstring jest bardzo złym pomysłem.

0

To jest n dowolnych liczb z zakresu 0-255. Jakie to jest kodowanie? Chcę mieć na końcu dokładnie te same liczby.

2

Albo masz dane binarne (wtedy nie używasz string wstring), albo tekstowe w jakimś kodowaniu: ASCII (jedno bajtowe) UTF-8 (o zmiennej ilości bajtów, wale trzyma się go w string), albo UTF-16 (wstring) albo USC-4 (wstring) albo ... .
Dane kryptograficzne są zwykłe zakodowane testowo ASCII/UTF-8. Sam tekst koduje dane klucza korzystając z hex albo base64.
Najpierw dokładnie ustal co i w jakim formacie masz.

0

Dlaczego uparłeś się na wstring? std::basic_string<> to de facto std::vector<> z kilkoma więcej funkcjami, przy czym wstring to konkretyzacja dla wchar_t, kiedy dla Twojego zastosowania char (czyli string) wydaje się znacznie logiczniejszy. Jedyne co może być problematyczne to konwersja bajtów unsigned ⟶ signed ⟶ unsigned, ale na wszystkich popularnych architekturach nie ma tutaj zaskoczeń (t.j. bit pattern pozostaje bez zmian), więc string jak najbardziej nadaje się do takiego zastosowania. Przy czym, pisząc nadaje się mam jedynie na myśli, że będzie działał zgodnie z zamierzeniami, a nie, że jest dobrym rozwiązaniem.

Dlaczego nie użyjesz po prostu vector<uint8_t>? Używając stringów jako kontenerów dajesz do zrozumienia, że ich zawartość jest tekstem, co w Twoim przypadku jest nieprawdą i może być mylące dla osób czytających Twój kod. vector takiego problemu nie ma.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0