CYFROWY BARON • PROGRAMOWANIE • Zobacz wątek - Operacja na tablicy Byte jak na Stringu ?

Operacja na tablicy Byte jak na Stringu ?

dział ogólny

Operacja na tablicy Byte jak na Stringu ?

Nowy postprzez Slynx » środa, 1 czerwca 2011, 22:08

Zastanawiałem się czy zamiast korzystać ze Stringa, mógłbym od razu wykorzystać tablicę typu Byte. Dlaczego ? Dane na których pracuje i tak muszą być w formacie ASCII i zostać przepisane do tablicy Byte.
Nie jest problemem samo stworzenie, chodzi mi o dopisywanie do końca takiego Stringa. Nawet jeśli zaczniemy od deklaracji samej tablicy, to pierwsze przypisanie przydzieli jej odpowiedni rozmiar, a mi zależy na szybkim powiększaniu rozmiaru lub jakimś ciekawym alternatywnym rozwiązaniu.
Wiem, że mogę użyć klasy vector lub po prostu funkcji .NET-owej "resize" do zmiany rozmiaru tablicy i za każdym razem gdy chcę dodać nowe dane, sprawdzić czy się zmieszczą i w razie konieczności zmienić rozmiar. Nie wiem jednak jak do wydajności mają się takie operacje, bo mówimy o dużych tablicach (~10MB).
Jakieś propozycje ? Bo stanąłem w trakcie pisania funkcji i zacząłem się nad tym zastanawiać, czy zamiast trzykrotnie przepisywać dane (array<Byte> <-> String^) nie można tego od razu upchnąć w typie wyjściowym.
---
W sumie to teraz widzę, że problem jest trochę bardziej skomplikowany. Dane są zbierane w trakcie działania programu, jedne typu String^ inne, jak strumień pliku jako tablica Byte. Sam plik nawet nie powinien być zapisywany do typu String, a pozostać już w formacie wyjściowym. Prosta kwestia gdy są np.
1. String
2. tablica Byte
3. String

Wtedy można po prostu trzykrotnie zapisać do strumienia, ale jeśli będzie coś takiego
1. String
2. tablica Byte
3. String
4. tablica Byte
5. String
to nie zapiszę tego w jednym strumieniu i 2 Stringach (nie można zapisać części, poczekać na zebranie reszty danych i zapisach kolejnych), więc pozostaje tylko rozwiązanie w postaci tablicy Byte dla wszystkich danych.

----
No cóż, na razie doszedłem do czegoś takiego. Funkcja do zapisu String-a
KOD cpp:     UKRYJ  
                Void Mail::MPF_Set_Field(String^ field, String^ value)
                {
                        System::Text::ASCIIEncoding^ encoding = gcnew System::Text::ASCIIEncoding;
                        String^ record = this->MPF_boundary + "\r\n" + "Content-Disposition: form-data; name=\"" + field + "\"" + "\r\n\r\n" + value + "\r\n";
                        array<Byte> ^ data = encoding->GetBytes(record);
                        Array::Resize(this->MPF_body, this->MPF_body->Length + data->Length);
                        Array::Copy(data, this->MPF_body, data->Length);
                }
 


I dla pliku
KOD cpp:     UKRYJ  
                Void Mail::MPF_Set_File(String^ name, String^ full_file_path)
                {
                        System::Text::ASCIIEncoding^ encoding = gcnew System::Text::ASCIIEncoding;

                        String^ record = this->MPF_boundary + "\r\n" + "Content-Disposition: form-data; name=\""
                                + name + "\"; filename=\"" + System::IO::Path::GetFileName(full_file_path) + "\""
                                + "\r\n" + "Content-type: application/octet-stream" + "\r\n\r\n";

                        array<Byte> ^ data = encoding->GetBytes(record);
                        array<Byte> ^ file_stream = System::IO::File::ReadAllBytes(full_file_path);

                        Array::Resize(this->MPF_body, this->MPF_body->Length + data->Length + file_stream->Length + 2);
                        Array::Copy(data, this->MPF_body, data->Length);
                        Array::Copy(file_stream, this->MPF_body, file_stream->Length);
                        this->MPF_body[this->MPF_body->Length-2] = 13;
                        this->MPF_body[this->MPF_body->Length-1] = 10;
                }
 

gdzie,
this->MPF_body jest tablicą typu Byte. To tyle co udało mi się (na razie) samemu wykombinować w tej kwestii.
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome

Re: Operacja na tablicy Byte jak na Stringu ?

Nowy postprzez polymorphism » czwartek, 2 czerwca 2011, 09:53

A po co tak się z tym bawisz? Użyj strumienia pamięciowego System.IO.MemoryStream.
C++ Reference - opis wszystkich klas STL-a i funkcji C.

Za ten post autor polymorphism otrzymał podziękowanie od:
Slynx
Avatar użytkownika
polymorphism
Doświadczony Programista ● Moderator
Doświadczony Programista ● Moderator
 
Posty: 2156
Dołączył(a): piątek, 19 grudnia 2008, 13:04
Podziękował : 0
Otrzymał podziękowań: 200
System operacyjny: Windows 8.1
Windows 10
Linux Mint 21.1
Kompilator: Visual Studio
Visual Studio Code
MSYS2 (MinGW, clang)
g++
clang
Gadu Gadu: 0
    Windows XPFirefox

Re: Operacja na tablicy Byte jak na Stringu ?

Nowy postprzez Slynx » czwartek, 2 czerwca 2011, 12:37

Właśnie tego było mi potrzeba. Już sprawdziłem i nada się bez problemu. To uprości pisanie
Thx,
Avatar użytkownika
Slynx
Mądrosław
Mądrosław
 
Posty: 350
Dołączył(a): piątek, 17 grudnia 2010, 21:59
Podziękował : 11
Otrzymał podziękowań: 0
System operacyjny: Windows 7 32
Kompilator: Visual C++ 2005; Visual C++ 2008; Visual C++ 2010; Visual C# 2010;
Gadu Gadu: 0
    Windows 7Chrome


  • Podobne tematy
    Odpowiedzi
    Wyświetlone
    Ostatni post

Powrót do Ogólne problemy z programowaniem

Kto przegląda forum

Użytkownicy przeglądający ten dział: Brak zalogowanych użytkowników i 6 gości