odczyt pliku binarnego z sql

0

Witam

Mam problem z odczytanie plików z bazy danych (MSSQL). Są w niej zapisane zdjęcia i sformatowany tekst w postaci ciągów binarnych. Nie wiem w jaki sposób były tam wrzucane, a chciał bym je teraz odczytać i zapisać do pliku. Czy ma ktoś sposób jak to zrobić, najlepiej w javie. W tabeli gdzie są te wartości binarne jest też kolumna z ratio, może to się do czegoś przyda.

0

Najlepiej jakbys wkleil tutaj przyklad takiego ciagu bajtow dla zdjecia oraz tekstu, wtedy ktos moglby sie przyjrzec. Moze to jest serializowane, moze zwycajnie tekst jest zmieniany na tablice byte[] w kodowaniu utf-8 - jednym slowem, mozliwosci jest mnostwo i bez dodatkowych informacji nie ma raczej szans zeby ktos odpowiedzial na pytanie, chyba ze jasnowidz.

0

To kod tekstu:

789C458E4D0A83301484BB16BC834748AC82E035BA9C4D7E5E34344D24897621DEBD5117DD0CC3FB3E8
6B72366C3217CB257A865E26DCFA0C9982B9DF013675DBFC3049FB374A530186F1D8C9A454C94DBE7D0
BCC41C3E623C8EBADAA1820BB1A8CD88489A618A449E41BA95D8580C6C96BE6FEB758755712C226AA8
F2C5399C5AD6644AF9BCD6D5BF419E6CB899BCC59B94C1C70FF7704518

kod obrazka:

789C9D927B34D46918C7DF31E6128A21DAECD64CC8A56872BF9B956429899262A5466288498CEB34B32
1B9B4EB48512C534ABAC9DAA6D2C5B88D4B6DDBE4CE284228A2DF8831638CDFCED4D9DD7FF68FDDFD
BEE779CEFB9EE779DFF3FD9CE7857BE13740CD639BFB3680400080902D002F017B171F57E73D5E3E7684D
0C326E1C742420971A69B36130C693194A85082BB871BC16397AB1B21CECACCC898104D3B7494129B48
7024D85A2AC1FDC0052820E4926705B91491F28C5254442AA25168F4E7C02CC3CA0283466395B1CB94E4
92ED54949554E407F9235FAE2AA090489412068D51FACF82EB000E0B8C801E12A103147008240E0173015E
0689FA6C4F46FA450805A4220A8D91D9509635DC5393D9472265A65132C7B2EA09591D28E250EAEB4C9D
D11ADE87303AD12BCD4EE65EC6EA6EA9AAD7F46983F4CCC9C753962969ADFA6AB5F67A7D0343A30D16
9656D636B6762E5B5DB7B97DE7EEB17B8FEF5EBF7DFBFD830F871C090DA384C7C4D2E2E213129352D34E
A59FCEC8CC3A9B77EE7C7EC1858B85A557AE965D2BBF7EE3E6AF77D9F7EE3FA87EF8A8A191DBD4DCD2F
AF4597B476757774F6F1F7F6878E4EDE8D8F8BBF71382994FB373C279917841CE850048C49FFA472E9C8C4
B413E038C9C0BA1102F6FC029A2D699A2D59DBD3187A23574CC4E62576EC9BD5C55BF4CD7DC07D2241
F6F53D2D2B3185A2F90A37D26FB776029FF8BEC2FB0BFB9F8400589900D0F890324209D6320FA56300E384
E22B9781C7DF510DD7FB2F095BBD3C0C11D4F0DA402BCC1CC6DE28F78F552C8A99872B5DFB2AEA6EB8
8A97F193BF9AD2E469F24143BF3E627DFAAF25585176AA02E210B82C1D0E899245E266DEA2085AF5F14199
F9D78E72A0CF229068B6CDE7983A218A29738B4E7F9DA69DF3C87C601561DDD4B4310F0145FD5D8317E4
39A5CDE46D26246C12095A56271911859CAE98A1A1EB6DF177938D3EB71AB60C60E06B7569CB8951DC4
8781F0725B2C4E709A4BBA7B2217B25FDEE190D4BAFD1D190625D5A449B707059A7447897B8281F01791F
94DFF70169B94566121B68C31EC989E7D1D3A65D5CEEC202E4C06E67CC896EC9834FF7EFF126FAD9300C
5E5E00491AFF66E6E19FB54F60A0615D9CF6070CD474C9BB77981A9F369ED0E2EE0F5D733357E7B293ACA
CA31FFF948B2F46251C7C2934188D70983E511F719FA2F236912D539EB6399BA0BDA461CEDB629BAE325F
EBB42728E0E1FF74DE2EC4ABFD19D3DA4A800BC0D0CEA5D18C6149652EC1A2718ECF0125D9FFBDABEC
8D32EAEA068A359B0B5D95655773DE9F3E00947DBC5FA9E71416D736D56091EC29C26B433D996C5F11F8
4F149AF07FB2A6E9368C48F21F9866533B55D8941C26ECE5D18A49C49081A6E995286010A03F97D104012
AE69D84CB85674D4A347A9CF33025C35BB9E5F59E207E385CD9C00E9258E76040941A791D218567D392B
025BACA7A99B6A479A27970A9B4C98DF42EB8DCB95F31C8C6F5E276FD82D2C58CC191BB0681C13976B
4893F648AFAD2DF60A0D91F2CE4C2DD9331A586C6A9D27D1B3CBC98A1E24F22DEF1FF01CA570E233E6F
A7976D4B02BEDA3652247896D82E480A7EE2EB6A81C1AD6CBE33E0AEAADCC1FE1E2F2689A9D3E62EFC4
4207664DC1B3A6E30BAA5C620A47B7D378D157D02FBC0883B4B3DBB1F4C78E4E6BC881FE12D9544ABC
5D257D1113957DBBDFACE256F28B863FA63B6D4E6819FA7DFE24432B419DCA166D6CB4CB99FE786F3B0
C16B0816E3030765B9CC9AA1665DB569E0B21F99558F3775E5B7AA12664E697DF687CE86BDCEF509E713
95518FB1E06BC178C985903B7AC308B569D6A56724673407756950AD9B001D99EB56834C11BEC6EC964B
4C1A00ADFC0E3BB3425F9713DA94D6BF5A1F18CD9307A85FD0128BD52685F3D22AE7EFA9397F8BD01551
CC654A94532EBED9C144451E239E6EAC184D416FFB462EA13DAF51626718C8C7F56B3409D731194E2E7D
CA08AFCD09CED131357466D4AF6FF2064ED13465C187A622D315B4442A764BFBE329D830B8BF3C37FEA3
6B123427786B12653C16A8D60EB1AD3DDDEFB6DDDA75F70CFF61A9666E5B2E0BE3F0082C3F1E0

na końcach linii dodane entery

klasa która odczytuje to z bazy:

 public static void main(String[] args) throws FileNotFoundException, SQLException, IOException {
        try {
            ResultSet result = DBConnect.connect.createStatement().executeQuery("select zaw_Zawartosc from sys_Zawartosc where zaw_ID=459070;");
            if(result.next()){
               FileWriter plik = new FileWriter("tmp.txt");
                BufferedWriter zapis = new BufferedWriter(plik);
                zapis.write(result.getString(1));
                zapis.close();
                plik.close();
            }
            result.close();
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
0

To kod tekstu:

789C458E4D0A83301484BB16BC834748AC82E035BA9C4D7E5E34344D24897621DEBD5117DD0CC3FB3E8
6B72366C3217CB257A865E26DCFA0C9982B9DF013675DBFC3049FB374A530186F1D8C9A454C94DBE7D0
BCC41C3E623C8EBADAA1820BB1A8CD88489A618A449E41BA95D8580C6C96BE6FEB758755712C226AA8
F2C5399C5AD6644AF9BCD6D5BF419E6CB899BCC59B94C1C70FF7704518

kod obrazka:

789C9D927B34D46918C7DF31E6128A21DAECD64CC8A56872BF9B956429899262A5466288498CEB34B32
1B9B4EB48512C534ABAC9DAA6D2C5B88D4B6DDBE4CE284228A2DF8831638CDFCED4D9DD7FF68FDDFD
BEE779CEFB9EE779DFF3FD9CE7857BE13740CD639BFB3680400080902D002F017B171F57E73D5E3E7684D
0C326E1C742420971A69B36130C693194A85082BB871BC16397AB1B21CECACCC898104D3B7494129B48
7024D85A2AC1FDC0052820E4926705B91491F28C5254442AA25168F4E7C02CC3CA0283466395B1CB94E4
92ED54949554E407F9235FAE2AA090489412068D51FACF82EB000E0B8C801E12A103147008240E0173015E
0689FA6C4F46FA450805A4220A8D91D9509635DC5393D9472265A65132C7B2EA09591D28E250EAEB4C9D
D11ADE87303AD12BCD4EE65EC6EA6EA9AAD7F46983F4CCC9C753962969ADFA6AB5F67A7D0343A30D16
9656D636B6762E5B5DB7B97DE7EEB17B8FEF5EBF7DFBFD830F871C090DA384C7C4D2E2E213129352D34E
A59FCEC8CC3A9B77EE7C7EC1858B85A557AE965D2BBF7EE3E6AF77D9F7EE3FA87EF8A8A191DBD4DCD2F
AF4597B476757774F6F1F7F6878E4EDE8D8F8BBF71382994FB373C279917841CE850048C49FFA472E9C8C4
B413E038C9C0BA1102F6FC029A2D699A2D59DBD3187A23574CC4E62576EC9BD5C55BF4CD7DC07D2241
F6F53D2D2B3185A2F90A37D26FB776029FF8BEC2FB0BFB9F8400589900D0F890324209D6320FA56300E384
E22B9781C7DF510DD7FB2F095BBD3C0C11D4F0DA402BCC1CC6DE28F78F552C8A99872B5DFB2AEA6EB8
8A97F193BF9AD2E469F24143BF3E627DFAAF25585176AA02E210B82C1D0E899245E266DEA2085AF5F14199
F9D78E72A0CF229068B6CDE7983A218A29738B4E7F9DA69DF3C87C601561DDD4B4310F0145FD5D8317E4
39A5CDE46D26246C12095A56271911859CAE98A1A1EB6DF177938D3EB71AB60C60E06B7569CB8951DC4
8781F0725B2C4E709A4BBA7B2217B25FDEE190D4BAFD1D190625D5A449B707059A7447897B8281F01791F
94DFF70169B94566121B68C31EC989E7D1D3A65D5CEEC202E4C06E67CC896EC9834FF7EFF126FAD9300C
5E5E00491AFF66E6E19FB54F60A0615D9CF6070CD474C9BB77981A9F369ED0E2EE0F5D733357E7B293ACA
CA31FFF948B2F46251C7C2934188D70983E511F719FA2F236912D539EB6399BA0BDA461CEDB629BAE325F
EBB42728E0E1FF74DE2EC4ABFD19D3DA4A800BC0D0CEA5D18C6149652EC1A2718ECF0125D9FFBDABEC
8D32EAEA068A359B0B5D95655773DE9F3E00947DBC5FA9E71416D736D56091EC29C26B433D996C5F11F8
4F149AF07FB2A6E9368C48F21F9866533B55D8941C26ECE5D18A49C49081A6E995286010A03F97D104012
AE69D84CB85674D4A347A9CF33025C35BB9E5F59E207E385CD9C00E9258E76040941A791D218567D392B
025BACA7A99B6A479A27970A9B4C98DF42EB8DCB95F31C8C6F5E276FD82D2C58CC191BB0681C13976B
4893F648AFAD2DF60A0D91F2CE4C2DD9331A586C6A9D27D1B3CBC98A1E24F22DEF1FF01CA570E233E6F
A7976D4B02BEDA3652247896D82E480A7EE2EB6A81C1AD6CBE33E0AEAADCC1FE1E2F2689A9D3E62EFC4
4207664DC1B3A6E30BAA5C620A47B7D378D157D02FBC0883B4B3DBB1F4C78E4E6BC881FE12D9544ABC
5D257D1113957DBBDFACE256F28B863FA63B6D4E6819FA7DFE24432B419DCA166D6CB4CB99FE786F3B0
C16B0816E3030765B9CC9AA1665DB569E0B21F99558F3775E5B7AA12664E697DF687CE86BDCEF509E713
95518FB1E06BC178C985903B7AC308B569D6A56724673407756950AD9B001D99EB56834C11BEC6EC964B
4C1A00ADFC0E3BB3425F9713DA94D6BF5A1F18CD9307A85FD0128BD52685F3D22AE7EFA9397F8BD01551
CC654A94532EBED9C144451E239E6EAC184D416FFB462EA13DAF51626718C8C7F56B3409D731194E2E7D
CA08AFCD09CED131357466D4AF6FF2064ED13465C187A622D315B4442A764BFBE329D830B8BF3C37FEA3
6B123427786B12653C16A8D60EB1AD3DDDEFB6DDDA75F70CFF61A9666E5B2E0BE3F0082C3F1E0

na końcach linii dodane entery

klasa która odczytuje to z bazy:

 public static void main(String[] args) throws FileNotFoundException, SQLException, IOException {
        try {
            ResultSet result = DBConnect.connect.createStatement().executeQuery("select zaw_Zawartosc from sys_Zawartosc where zaw_ID=459070;");
            if(result.next()){
               FileWriter plik = new FileWriter("tmp.txt");
                BufferedWriter zapis = new BufferedWriter(plik);
                zapis.write(result.getString(1));
                zapis.close();
                plik.close();
            }
            result.close();
        } catch (SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }

    }
0

Ma ktoś pomysł jak to odczytać? Może to jest w jakiś sposób skompresowane?

0

a próbowałeś otworzyć to inną klasą? np. ByteArrayInputStream ? albo ogólnikowo RandomAccesFile... Popróbuj...może coś uzyskasz...W tym pliku masz cyfry i litery więc może to być odczytane w systemie szesnastkowym...Ale to tylko moje przemyślenia :)

pozdr.

0

Próbowałem odczyta to jako archiwum i zdekompresować ale tez nic z tego. Używałem klasy java.util.zip. Czy są inne sposoby? Czy to jest to samo co biblioteka zlib?

0

Nie ma nikt na to pomysłu?

0

Sprobuj moze Base64, na pierwszy rzut oka wyglada jakby mogla to byc to.

0

To są hexy. Wrzuć to do edytora np: HxD.

0

Mi sie wydaje ze kolega nie pyta jak odczytac tego bloba, tylko co z nim zrobic jak juz go odczyta, bo poki co ma smieciory.

0

No właśnie chodzi o te śmieciory, bo z samym odczytem nie ma problemu. Spróbuje to Base64.

0

Nic z tego. Wydaje mi się, że to jest skompresowanie w jakiś sposób.

0

Zauwaz ze oba smieciory zaczynaja sie 789C. Pobierznie szukajac w necie okazuje sie ze 0x789C to jest poczatek headera ZLIB. Zatem, bez wiekszych badan, powiedzialbym ze to co masz to jest test / obrazek skompresowany ZLIB a pozniej wynikle bajty zmaienione na hexstring. Czyli sprobuj zrobic odwrotnie - najiperw zamien ten hexstring na bajty, a nastepnie sprobuj rozpakowac.
Jak znajde chwile czasu dzisiaj to moze zobacze, ale nie obiecuje ze to zrobie, ani ze mi sie uda, wiec lepiej zacznij powoli sam nad tym pracowac.

0

Coś takiego udało mi się wyciągnąć z tego pierwszego:

{\rtf1\ansi\ansicpg1250\deff0\deflang1045{\fonttbl{\f0\fnil\fcharset238 Tahoma;}}
{\colortbl ;\red0\green0\blue0;}
\viewkind4\uc1\pard\cf1\f0\fs20 test\par
test\par
\b\fs28 test\b0\fs20\par
}

A coś takiego z obrazka:
user image

0

Czyli plik RTF. A jak to wyciagnales?

0

Za twoją radą: hex tekst na bajty i zlibem.

0

Spoko, czyli juz nie musze probowac ;d

0

Tak na marginesie, zapisalem to co iooi uzyskal do pliku o rozszerzeniu RTF i uruchomilem w OO.org, i plik ma 3 linijki, kazda ma tekst "test", ale z roznymi efektami czcionki. Czyli jest ok.

@iooi: moze wklej kod ktorym to zrobiles, coby temat byl bardziej wartosciowy?

0
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.math.BigInteger;
import java.util.zip.Inflater;

// ...

String inputFile = "plik_gdzie_zapisałem_tekst_marcinka";
String outputFile = "plik_gdzie_zapisałem_wyjście";
int buffSize = 2048;

BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile)));

String inputString = "";
String line;
while ((line = reader.readLine()) != null) {
	inputString += line;
}

byte[] input = new BigInteger(inputString, 16).toByteArray();

Inflater inflater = new Inflater();
inflater.setInput(input);

byte[] buff = new byte[buffSize];
int length = inflater.inflate(buff);

FileOutputStream out = new FileOutputStream(outputFile);
out.write(buff, 0, length);

out.close();
reader.close();

Dla obydwu plików.
Pewnie można lepiej, szybciej i prościej, choćby nie korzystając z BufferedReadera, BigIntegera. Nie miałem nawet pojęcia o istnieniu klasy Inflater ;d

(poprawiony obrazek w poprzednim poście)

0

A mógłbyś napisać jak wyciągnąłeś ten obrazek?

0

Zapisałem z rozszerzeniem .jpg (sugerowałem się headerem: "CREATOR: gd-jpeg v1.0 (using IJG JPEG v62)").

0

Ok. Wielkie dzięki kolego. A miałbyś jeszcze pomysł jak zapisać ten sformatowany tekst?

0

Który, wejściowy, czy wyjściowy rtf?

0

Wyjściowy, ale już sobie poradziłem. Tylko mam inny problem. Ten przykładowy jpg był bardzo mały. Gdy wziąłem większy plik to odczytał się tylko pasek na górze, a reszta była szara. W inny przypadku program tak jakby się zapętlił. Był uruchomiony przez 5min i nic. Co to może być?

0

Inflater jest uzywany troche zle - w tym przypadku nie zadziala poprawnie jesli input po rozpakowaniu bedzie wiekszy niz bufer, powinno to byc robione w petli, jakos tak:

byte[] bytes = hexStringToByteArray(TEXT);
Inflater inflater = new Inflater();
inflater.setInput(bytes);
ByteArrayOutputStream out = new ByteArrayOutputStream(bytes.length * 2);
byte[] buffer = new byte[bytes.length * 2];
while (!inflater.finished()) {
    int count = inflater.inflate(buffer);
    out.write(buffer, 0, count);
}
out.close();
inflater.end();

Po tej operacji out.getByteArray() zwroci rozpakowane bajty, ktore mozna zapisac do pliku czy cokolwiek.
Jak zapisac tekst / obrazek do bazy? Odwroc kolejnosc:

  1. musisz otrzymac bajty, czyli wczytac obrazek / tekst z dysku, wzglednie jak obrazek / tekst jest w pamieci, to zamienic na bajty
  2. zamienic tablice bajtow na hexString, w necie masz mnostwo przykladow
  3. wynikly hexstring zamienic na bajty i zapodac do Deflatora, ktory musi w podobnej petli przemielic dane.
0

Nadal jest coś nie tak. Plik jpg 132kb poszedł bez problemu. Ale na 500 kb już się zawiesiło.

Taki mam kod:

ResultSet result = DBConnect.connect.createStatement().executeQuery("select zaw_Zawartosc from sys_Zawartosc where zaw_ID=12749;");
        if(result.next()){
                String outputFile = "temp.jpg";
                int buffSize = 2048;

                BufferedReader reader = new BufferedReader(result.getCharacterStream(1));

                String inputString = "";
                String line;
                while ((line = reader.readLine()) != null) {
                        inputString += line;
                }

                    byte[] bytes = new BigInteger(inputString, 16).toByteArray();
                    Inflater inflater = new Inflater();
                    inflater.setInput(bytes);
                    ByteArrayOutputStream out = new ByteArrayOutputStream(bytes.length * 2);
                    byte[] buffer = new byte[bytes.length * 2];
                    while (!inflater.finished()) {
                        int count = inflater.inflate(buffer);
                        out.write(buffer, 0, count);
                    }
                    FileOutputStream outFile = new FileOutputStream(outputFile);
                    outFile.write(out.toByteArray());
                    outFile.close();
                    out.close();
                    inflater.end();
        }
        result.close();
0
marcinek2929 napisał(a)

Nadal jest coś nie tak. Plik jpg 132kb poszedł bez problemu. Ale na 500 kb już się zawiesiło.

Taki mam kod:

ResultSet result = DBConnect.connect.createStatement().executeQuery("select zaw_Zawartosc from sys_Zawartosc where zaw_ID=12749;");
if(result.next()){
String outputFile = "temp.jpg";
int buffSize = 2048;

            BufferedReader reader = new BufferedReader(result.getCharacterStream(1));

            String inputString = "";
            String line;
            while ((line = reader.readLine()) != null) {
                    inputString += line;
            }

                byte[] bytes = new BigInteger(inputString, 16).toByteArray();
                Inflater inflater = new Inflater();
                inflater.setInput(bytes);
                ByteArrayOutputStream out = new ByteArrayOutputStream(bytes.length * 2);
                byte[] buffer = new byte[bytes.length * 2];
                while (!inflater.finished()) {
                    int count = inflater.inflate(buffer);
                    out.write(buffer, 0, count);
                }
                FileOutputStream outFile = new FileOutputStream(outputFile);
                outFile.write(out.toByteArray());
                outFile.close();
                out.close();
                inflater.end();
    }
    result.close();

W tym kodzie masz 2 problemy:
1. zamiana hex stringa na byte[] za pomoca new BigInteger - pomysl sobie, ze string ktory ma 500kb przedstawia wielka liczbe, i ty chcesz taka liczbe utworzyc - pomysl ile zajmuje parsowanie tego, obliczanie itp. Zamiast 
byte[] bytes = new BigInteger(inputString, 16).toByteArray();
uzyj tej metody:
```java
public byte[] hexStringToByteArray(String s) {
    byte[] bytes = new byte[s.length() / 2];
    for (int i = 0, b = 0; i < s.length(); i += 2, ++b) {
        byte first = (byte) Character.digit(s.charAt(i), 16);
        byte second = (byte) Character.digit(s.charAt(i + 1), 16);
        bytes[b] = (byte) (first << 4 | second);
    }
    return bytes;
}

Ta metoda tez ma slabosc i moze przestac dzialac dla wielkich plikow poniewaz opera sie na tym ze wczytujesz caly string (wspomniane 500kb) i nastepnie zamieniasz go na tablice bajtow (kolejnce 500kb), i trzymajac uchwyty do stringa i do tablicy bajtow uniemozliwiasz aby GC sprzatnal. Po zamianie stringa na byte[] ustaw inputString na null, umozliwisz GC sprzatniecie tego smiecia. A najlepiej jakbys zrobil tak, aby string byl wczytywany porcjami zamiast skladac go calego (porcja to np to co zwroci readLine(), i nastepnie pojedyncze porcje zamieniac na bajty (upewnij sie ze ma parzysta liczbe znakow, inaczej hexStringToBytes nie zadziala poprawnie), podawac do inflatera ktory tylko rozkoduja dana porcje, od razu ja zapisac do pliku. Inflater umie tak pracowac, poczytaj o metodzie needsInput i setInput. Nie jest to trywialne jak sie nigdy nie bawiles, a widac ze sie nie bawiles.

zapisujesz do ByteArrayOutputStream tylko po to zeby zaraz pozniej wszystko przerzucic do FileOutputStream - wiec po cholere ci ten tymczasowy ByteArrayOutputStream? Niech inflater od razu zapisuje do pliku.</li> </ol>

Pamietaj, ze kody ktore tu dostajesz (np wspomniany BigInteger) to sa kody pisane na szybko, prototypowe, aby cos pokazac - nie sa kodami ktore mozna wrzucic na produkcje. Kolega iooi na pewno by inaczej zmienil hexString na byte[] gdyby musial to zrobic porzadnie. Mysl przy tym co czytasz, analizuj. Poza tym, spytales jak rozkodowac, dostales az nadto odpowiedzi, powinno wystarczyc juz to ze iooi powiedzial ze moje przypuszczenia sa sluszne. Jak chcesz kod ktory bedzie szybki, nie wywalal sie, gotowy na produkcje, wspieral gigabajtowe pliki itp to niestety ale bedziesz musial sypnac kasa zeby ktos taki kod napisal. To co masz teraz to zaciekawienie paru osob jakimstam wyzwaniem i proof of concept, nic wiecej.

0

Mala poprawka - dla stringa 500kb tablica byte[] bedzie 250kb, bo to jest polowa z tego, co nie zmienia faktu ze to i owo jest niepotrzebnie przetrzymywane. Cala reszta nadal obowiazuje.

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