Fetstil Fetstil Kursiv Understrykning linje färgläggning tabellverk Punktlista Nummerlista Vänster Centrerat högerställt Utfyllt Länk Bild htmlmode
  • Forum & Blog
    • Forum - översikt
      • .Net
        • asp.net generellt
        • c#
        • vb.net
        • f#
        • silverlight
        • microsoft surface
        • visual studio .net
      • databaser
        • sql-server
        • databaser
        • access
        • mysql
      • mjukvara klient
        • datorer och komponenter
        • nätverk, lan/wan
        • operativsystem
        • programvaror
        • säkerhet, inställningar
        • windows server
        • allmänt
        • crystal reports
        • exchange/outlook
        • microsoft office
      • mjukvara server
        • active directory
        • biztalk
        • exchange
        • linux
        • sharepoint
        • webbservers
        • sql server
      • appar (win/mobil)
      • programspråk
        • c++
        • delphi
        • java
        • quick basic
        • visual basic
      • scripting
        • asp 3.0
        • flash actionscript
        • html css
        • javascript
        • php
        • regular expresssion
        • xml
      • spel och grafik
        • DirectX
        • Spel och grafik
      • ledning
        • Arkitektur
        • Systemutveckling
        • krav och test
        • projektledning
        • ledningsfrågor
      • vb-sektioner
        • activeX
        • windows api
        • elektronik
        • internet
        • komponenter
        • nätverk
        • operativsystem
      • övriga forum
        • arbete karriär
        • erbjuda uppdrag och tjänster
        • juridiska frågor
        • köp och sälj
        • matematik och fysik
        • intern information
        • skrivklåda
        • webb-operatörer
    • Posta inlägg i forumet
    • Chatta med andra
  • Konto
    • Medlemssida
    • Byta lösenord
    • Bli bonsumedlem
    • iMail
  • Material
    • Tips & tricks
    • Artiklar
    • Programarkiv
  • JOBB
  • Student
    • Studentlicenser
  • KONTAKT
    • Om pellesoft
    • Grundare
    • Kontakta oss
    • Annonsering
    • Partners
    • Felanmälan
  • Logga in

Hem / Forum översikt / inlägg

Posta nytt inlägg


Base64 omvandling

Postades av 2007-10-17 17:26:14 - Kennet Carlsen, i forum c++, Tråden har 6 Kommentarer och lästs av 2173 personer

Hej!

Problem:
Jag har en tid jobbat med att försöka konvertera innehållet i en binärfil (*.bmp) till en textsträng för att kunna lägga till den som en del av en befintlig textfil. Tanken är att jag vid behov ska kunna plocka ut den delen av textfilen som utgör den ”encodade” delen d.v.s. bitmappen i form av en textsträng igen, ”decoda” tillbaka den till en binär fil, en bitmap, vid ett senare tillfälle.

Problemet jag har är att jag kan encoda/decoda vanliga textsträngar men när jag ska decoda en binärfil te.x. bmp eller jpeg då får jag ut en mycket kort bit av filen, bara några k. Orginalfilen kan vara på te.x. 20kb ut kommer 1-3 kb. Det verkar som om den stöter på tecken som den inte klarar av att hantera. Jag (vi) vet att encodningen troligen fungerar okay då den är ganska beprövad. Nytt är behovet av att decoda tillbaka till en bitmap fil och det är då det skiter sig.

Jag har haft en diskussion igång på Microsoft som inte gav något då vi tycks ha ”pratat” förbi varandra. Jag valde att bryta då jag inte kände att det var meningsfullt. Men här är länken:
http://forums.microsoft.com/msdn/showpost.aspx?postid=2271777&siteid=1&sb=0&d=1&at=7&ft=11&tf=0&pageid=0


Förutsättningar:
Grundförutsättningarna är att jag idag jobbar i ett projekt som av olika skäl kompileras i VC++ 6.0 alltså en ganska gammal kompilator. Detta gör att jag inte har tillgång till nyare och smartare typ konverteringar

Nedan kod är kopplad till följande exempel från Microsoft:
http://support.microsoft.com/kb/191239


Här kommer de två funktioner som jag använder i mina encod/decod försök.


< code c++ >
///////////////////////////////////////////////////////////////////////////////
// DESCRIPTION:
// Creates base 64 code from file
// Returns true if everything is okay
//
// INPUT: strInputFile - Path to the file to be encoded
// OUTPUT: strOutput - The encoded file
//
bool encode_binary_to_base64( const CString& strInputFile, CString& strOutput )
{
bool blnReturn = false;
CStdioFile stdFileRead;
//Open and read binary file
int intInputFlags = CFile::modeRead | CFile::typeBinary;
if( stdFileRead.Open( strInputFile, intInputFlags ) )
{
//The source code come from Microsoft from
//http://support.microsoft.com/kb/191239
Base64Coder Coder;
//The size of the buffer to be created must be 75% of
//the string
const int intBufSize = 45;
unsigned char chBuffer[intBufSize];
bool blnStop = false;
// TimeOut to prevent never ending loops
int intTimeOut = 10000000;
// read and encode on line at the time.
for( int i = 0; ! blnStop && i < intTimeOut; ++i )
{
// How many characters have been read
// intBufSize gives you max number of characters that
//are allowed to be read at the time
int intCurrentSize = stdFileRead.Read( chBuffer, intBufSize );
//If theres not enough characters to fil the buffer
//it means that its the last line and we can
//leave the loop
if( intCurrentSize < intBufSize )
{
blnStop = true;
}
// encoding string in buffer.
Coder.Encode( chBuffer, intCurrentSize );
// Get the encoded string.
CString strEncoded = (LPCTSTR)Coder.EncodedMessage();
// exit if the string is empty
if( ! strEncoded.IsEmpty() )
{
blnReturn = true;
}
// Add a "\n" if it's not the last line
if( ! blnStop && i < intTimeOut-1 )
{
strEncoded += _T("\n");
}
// Add the encoded line to output.
strOutput += (LPCTSTR)strEncoded;
}
// close the file.
stdFileRead.Close();
}
return blnReturn;
}
///////////////////////////////////////////////////////////////////////////////
// DESCRIPTION:
// Decode base64-code
//
// INPUT: strInput - The encoded string
// OUTPUT: strOutstrOutputFile - Path to the file to be created.
//
bool decode_base64_to_binary( const CString& strInput, const CString& strOutputFile )
{
bool blnReturn = false;
// open a file
HANDLE hFile = ::CreateFile(strOutputFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
//The source code come from Microsoft from
//http://support.microsoft.com/kb/191239
Base64Coder Coder;

//Wreckage from some testing I've done
//char *pEncodeData = "VGhpcyBpcyBhIHRlc3QgDQogT2YgdG
//hlIG\r\nxpbmUNCkJyZWFrcwlEb2RhLgAA=";
const CString testString = "VGhpcyBpcyBhIHRlc3QgDQogT2YgdGhlIG\r\nxpbmUNCkJyZWFrcwlEb2RhLgAA=";
//Convert CString to char
const char* pszText = testString ;
char *pEncodeData = (char *)pszText;
// Decode whats in the pEncodeData
Coder.Decode(pEncodeData);
CString strDencoded = (LPCTSTR)Coder.DecodedMessage();
// exit if the string is empty
if( ! strDencoded.IsEmpty() )
{
blnReturn = true;
}
CFile myFile((int) hFile);
myFile.SetFilePath(strOutputFile);
//Write to my newly created file
myFile.Write((LPCTSTR)strDencoded, strlen(strDencoded));
myFile.Flush();
myFile.Close();
}
else
{
blnReturn = true;
}
return blnReturn;
}
< /code >



Med vänliga hälsningar
Kennet


Svara

Sv: Base64 omvandling

Postades av 2007-10-17 19:03:46 - Niklas Jansson

Tyvärr är koden omöjlig att läsa, eftersom den inte är indenterad. Försök att lägga den mellan < code c++ > < /code > (utan mellanslag) och indentera ordentligt.

I princip så är ju grundregeln att det i filen kan finnas filslutstecken, och det bör du då kunna lösa genom att se till att filen läses binärt, och kolla med "riktiga" funktioner om den är slut. Du verkar åtminstone öppna binärt.

Hur som helst så borde du inte använda microsofts fulsträng, microsofts fulfilstream eller gamla char-arrayer. VC6 bör kunna arbeta med fstream och vector korrekt.

Principlösningen blir då:

{
  std::ifstream f(...);
  std::vector<unsigned char> v;
  unsigned char c;
  f >> c;
  while(!f.eof())
  {
    v.push_back(c);
    f >> c;    
  }
  return encode(v);
}

Det är dock inte helt uppenbart vad problemet med din kod är, kan du beskriva vad det är för fel?


Svara

Sv: Base64 omvandling

Postades av 2007-10-17 19:24:38 - Simon Dahlbacka

tja, åtminstone

strlen(strDencoded)

..låter ju som om det tar slut vid första \0 tecken


Svara

Sv:Base64 omvandling

Postades av 2007-10-17 20:10:48 - Kennet Carlsen

Hoppsan! Hoppas det ser bättre ut nu. Synd att det inte finns någon preview.


Mvh/Kennet


Svara

Sv: Base64 omvandling

Postades av 2007-10-17 21:31:16 - Simon Dahlbacka

<b>(utan mellanslag)</b> ..var det så nej, ännu ser det inte bättre ut


Svara

Sv: Base64 omvandling

Postades av 2007-10-17 22:23:49 - Martin Adrian

Ett litet trick för att läsa in en hel fil i minnet.

<code>
// Öppna för läsning och append(!)
std::ifstream file(filename, std::ios:in|std::ios::binary|std::ios::ate);
// Vi är i slutet av filen så nuvarande position = längden
std::vector<unsigned char> data(file.tellg());
// hoppa tilbaka till början
file.seekg(0, std::ios::beg);
// läs in all data
file.read(&data[0], data.size());
file.close();

Base64Coder Coder;
Coder.Encode(&data[0], data.size());
cout << Code.EncodedMessage();
</code>


Svara

Nyligen

  • 19:38 Rekommendera något intressant
  • 19:13 Международная перевозка грузов
  • 00:01 DL Van Tuning | Exclusive Body Kit
  • 12:08 Indian casino
  • 04:14 Vad finns det för kratomalternativ
  • 14:16 Indian online casino
  • 14:15 Indian online casino
  • 08:28 Butiksskyltar: Hur upplever utbude

Sidor

  • Hem
  • Bli bonusmedlem
  • Läs artiklar
  • Chatta med andra
  • Sök och erbjud jobb
  • Kontakta oss
  • Studentlicenser
  • Skriv en artikel

Statistik

Antal besökare:
Antal medlemmar:
Antal inlägg:
Online:
På chatten:
4 570 868
27 964
271 768
494
0

Kontakta oss

Frågor runt konsultation, rådgivning, uppdrag, rekrytering, annonsering och övriga ärenden. Ring: 0730-88 22 24 | pelle@pellesoft.se

© 1986-2013 PelleSoft AB. Last Build 4.1.7169.18070 (2019-08-18 10:02:21) 4.0.30319.42000
  • Om
  • Kontakta
  • Regler
  • Cookies