没有必要用二进制字符串吧,
这样会增大至少8倍的传输量的,可以把它转成ascii码传输,
传输量小,并且容易做,

解决方案 »

  1.   

    先把一个规律性较强的二进制文件(如0x00到0xff循环出现)作为假象的二进制图片转化到XML,再转换回来,用UltraEdit打开看看问题出在哪?
      

  2.   

    最好找个图标ICON文件试验一下,16X16的很简单,你看看delphi自己的from里是怎么存储的,因为我们用记事本打开delphi的dfm时,图像也是字符串存储的啊,而且vs.net中的窗体,用xml格式存储,它的图片也是用xml存储的,你看看vs.net中的方法!
      

  3.   

    各位,若是你们要将数据库中的图片信息读出放到XML中,你是怎样做的?我的源代码大致如下:下面代码将图片信息放到XML文件里:var
      strFirst,strLast:string;
      sStream:TMemoryStream;
    begin
      sStream:=TMemoryStream.create;
      ADOTable1.open;
      TBlobField(ADOTable1.fieldbyname('Graphic')).SavetoStream(sStream);
      setlength(strFirst,sStream.size);
      sStream.Read(strFirst[1],sStream.size);
      strLast:=EncodeString(strFirst);//这是Delphi自带EncdDecd.pas文件
                    //里的编码函数。
      // 下面就是将strLast字符串加入到XML文件里相应接点里
      sStream.free;end;
    下面代码将从XML文件里读出的字符串解码后存为BMP文件:var
      strFirst,strLast:string;
      sStream:TMemoryStream;
    begin
      //从XML里读出存储图片数据的字符串得到strFirst:
      strLast:=DecodeString(strFirst);
      sStream:=TMemoryStream.create;
      sSTream.Write(strLast,length(strLast));
      sSTream.SaveToFile('Test.bmp');
      sStream.free;end;但是,当我企图打开Test.bmp 时,却报错说,文件格式不对或者不完全。
    请问,问题出在哪儿?紧急!
      
      

  4.   

    你把内存流转为String是比较危险的(数据有可能被delphi处理,delphi增加长度和引用次数据),建议使用arrayofchar;
      还有,操作时不要用内存流,我觉得应该使用字段流如下:
    var
        SStream:TBlobStream;
    begin
        SSTream:=TBlobStream.Create(TBlobField(query1.FieldByName('image')), bmRead)
      你把这两点改了,在试试。
      

  5.   

    刚才写的是array of char,空格忘写了。
      

  6.   

    我做了这样一个实验,图片还是显示不出来!问题出字哪儿?var
      Temp,mStream:TMemoryStream;
      str:array[0..2101] of char;
      size:integer;
    begin
      mStream:=TMemoryStream.Create ;
      mStream.LoadFromFile('MS.bmp');
      size:=mStream.Size ;
      mStream.Read(str,size);
      mStream.Free;
     
      Temp:=TMemoryStream.Create ;
      Temp.Write(str,size);
      Image1.Picture.Bitmap.LoadFromStream(Temp);
      Image1.Visible :=true;
      
      Temp.Free;
    end;请高手指点!谢谢!
      

  7.   

    我做了这样一个实验,图片还是显示不出来!问题出字哪儿?var
      Temp,mStream:TMemoryStream;
      str:array[0..2101] of char;
      size:integer;
    begin
      mStream:=TMemoryStream.Create ;
      mStream.LoadFromFile('MS.bmp');
      size:=mStream.Size ;
      mStream.Read(str,size);
      mStream.Free;
     
      Temp:=TMemoryStream.Create ;
      Temp.Write(str,size);
      Image1.Picture.Bitmap.LoadFromStream(Temp);
      Image1.Visible :=true;
      
      Temp.Free;
    end;请高手指点!谢谢!
      

  8.   

    实验的问题是因为我犯了个小错误,已经解决。但是,写入和读出XML还是不行!
    高手帮忙!
      

  9.   

    这是我摘录的XMLDataset控件的一段源代码,里面就有如何将
    一个TBlobField的内容转化为XML的 CDATA 节点的内容。如果需要全部源代码,请mail我。[email protected]请特别关注 MimeEncodeString 函数
    -----------------------------------------------------------------
    Procedure TXMLDataset.SaveToStream(AStream: TStream);
    Var
      Stream1: TStream;
      Procedure StringToStream(AString: String);
      Begin
        Stream1.Write(PChar(AString)^, Length(AString));
      End;  Procedure LocalMimeEncodeNoCRLF(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
      Var
        InValue1: Cardinal;
        OuterLimit1: Cardinal;
        InPointer1: PByte;
        InnerLimit1: PByte;
        OutPointer1: TPMimeByte4;
      Begin
        If AInputByteCount = 0 Then Exit;
        InPointer1 := @AInputBuffer;
        OutPointer1 := @AOutputBuffer;    OuterLimit1 := AInputByteCount Div 3 * 3;    InnerLimit1 := @AInputBuffer;
        Inc(Cardinal(InnerLimit1), OuterLimit1);    { Last line loop. }
        While InPointer1 <> InnerLimit1 Do Begin
          { Read 3 bytes from AInputBuffer. }
          InValue1 := InPointer1^;
          InValue1 := InValue1 Shl 8;
          Inc(InPointer1);
          InValue1 := InValue1 Or InPointer1^;
          InValue1 := InValue1 Shl 8;
          Inc(InPointer1);
          InValue1 := InValue1 Or InPointer1^;
          Inc(InPointer1);
          { Write 4 bytes to AOutputBuffer (in reverse order). }
          OutPointer1^.b4 := MIME_ENCODE_TABLE[InValue1 And $3F];
          InValue1 := InValue1 Shr 6;
          OutPointer1^.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
          InValue1 := InValue1 Shr 6;
          OutPointer1^.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
          InValue1 := InValue1 Shr 6;
          OutPointer1^.b1 := MIME_ENCODE_TABLE[InValue1];
          Inc(OutPointer1);
        End;    { End of data & padding. }
        Case AInputByteCount - OuterLimit1 Of
          1: Begin
              InValue1 := InPointer1^;
              InValue1 := InValue1 Shl 4;
              OutPointer1.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
              InValue1 := InValue1 Shr 6;
              OutPointer1.b1 := MIME_ENCODE_TABLE[InValue1];
              OutPointer1.b3 := MIME_PAD_CHAR; { Pad remaining 2 bytes. }
              OutPointer1.b4 := MIME_PAD_CHAR;
            End;
          2: Begin
              InValue1 := InPointer1^;
              Inc(InPointer1);
              InValue1 := InValue1 Shl 8;
              InValue1 := InValue1 Or InPointer1^;
              InValue1 := InValue1 Shl 2;
              OutPointer1.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
              InValue1 := InValue1 Shr 6;
              OutPointer1.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
              InValue1 := InValue1 Shr 6;
              OutPointer1.b1 := MIME_ENCODE_TABLE[InValue1];
              OutPointer1.b4 := MIME_PAD_CHAR; { Pad remaining byte. }
            End;
        End;
      End;  Procedure LocalMimeEncodeFullLines(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
      Var
        InValue1: Cardinal;
        OuterLimit1: Cardinal;
        InnerLimit1: PByte;
        InPointer1: PByte;
        OutPointer1: TPMimeByte4;
      Begin
        If AInputByteCount = 0 Then Exit;
        InPointer1 := @AInputBuffer;
        OutPointer1 := @AOutputBuffer;    InnerLimit1 := InPointer1;
        Inc(Cardinal(InnerLimit1), MIME_DECODED_LINE_BREAK);    OuterLimit1 := Cardinal(InPointer1);
        Inc(OuterLimit1, AInputByteCount);
      

  10.   

    While Cardinal(InnerLimit1) <= OuterLimit1 Do Begin { Multiple line loop. }
          While InPointer1 <> InnerLimit1 Do Begin
            { Read 3 bytes from AInputBuffer. }
            InValue1 := InPointer1^;
            InValue1 := InValue1 Shl 8;
            Inc(InPointer1);
            InValue1 := InValue1 Or InPointer1^;
            InValue1 := InValue1 Shl 8;
            Inc(InPointer1);
            InValue1 := InValue1 Or InPointer1^;
            Inc(InPointer1);
            { Write 4 bytes to AOutputBuffer (in reverse order). }
            OutPointer1^.b4 := MIME_ENCODE_TABLE[InValue1 And $3F];
            InValue1 := InValue1 Shr 6;
            OutPointer1^.b3 := MIME_ENCODE_TABLE[InValue1 And $3F];
            InValue1 := InValue1 Shr 6;
            OutPointer1^.b2 := MIME_ENCODE_TABLE[InValue1 And $3F];
            InValue1 := InValue1 Shr 6;
            OutPointer1^.b1 := MIME_ENCODE_TABLE[InValue1];
            Inc(OutPointer1);
          End;
          { Write line break (CRLF). }
          OutPointer1^.b1 := 13;
          OutPointer1^.b2 := 10;
          Inc(Cardinal(OutPointer1), 2);
          Inc(InnerLimit1, MIME_DECODED_LINE_BREAK);
        End;
      End;  Procedure LocalMimeEncode(Const AInputBuffer; Const AInputByteCount: Cardinal; Out AOutputBuffer); //rjMime
      Var
        IDelta, ODelta: Cardinal;
      Begin
        LocalMimeEncodeFullLines(AInputBuffer, AInputByteCount, AOutputBuffer);
        IDelta := AInputByteCount Div MIME_DECODED_LINE_BREAK; // Number of lines processed so far.
        ODelta := IDelta * (MIME_ENCODED_LINE_BREAK + 2);
        IDelta := IDelta * MIME_DECODED_LINE_BREAK;
        LocalMimeEncodeNoCRLF(Pointer(Cardinal(@AInputBuffer) + IDelta)^, AInputByteCount - IDelta, Pointer(Cardinal(@AOutputBuffer) + ODelta)^);
      End;{$IFDEF HUMAN_READABLE}
      Function MimeEncodeString(Const AInputString: AnsiString): AnsiString; //rjMime
        Procedure MimeEncodedSize(Const AValue: Cardinal; Out AResult: Cardinal); //rjMime
        Begin
          AResult := (AValue + 2) Div 3 * 4 + (AValue - 1) Div MIME_DECODED_LINE_BREAK * 2;
        End;
      Var
        Value1: Cardinal;
        Size1: Cardinal;
      Begin
        If Pointer(AInputString) <> Nil Then Begin
          Value1 := Cardinal(Pointer(Cardinal(AInputString) - 4)^);
          MimeEncodedSize(Value1, Size1);
          SetLength(Result, Size1);
          LocalMimeEncode(Pointer(AInputString)^, Value1, Pointer(Result)^);
        End Else Result := '';
      End;
    {$ELSE}
      Function MimeEncodeString(Const s: AnsiString): AnsiString;
        Function MimeEncodedSizeNoCRLF(Const i: Cardinal): Cardinal;
        Begin
          Result := (i + 2) Div 3 * 4;
        End;
      Var
        l: Cardinal;
      Begin
        Result := '';
        If Pointer(s) <> Nil Then Begin
          l := Cardinal(Pointer(Cardinal(s) - 4)^);
          SetLength(Result, MimeEncodedSizeNoCRLF(l));
          LocalMimeEncodeNoCRLF(Pointer(s)^, l, Pointer(Result)^);
        End;
      End;
    {$ENDIF}  Procedure PutEscapeChars(Const AInput: AnsiString; Out AOutput: AnsiString; Const AIgnoreSemicolon: Boolean);
      Var
        InputIndex1: Integer;
        OutputIndex1: Integer;
        InputLength1: Integer;
      Begin
     
       End;  Function WithEscapeChars(Const AInput: AnsiString; Const AIgnoreSemicolon: Boolean): AnsiString;
      Begin
        PutEscapeChars(AInput, Result, AIgnoreSemicolon);
      End;  Procedure WriteXMLProperties;
      Var
        Encoding1: AnsiString;
      Begin
        Encoding1 := Trim(XMLEncodingToString(FEncoding));
        If Encoding1 <> '' Then Begin
          StringToStream(XML_BEGIN + SPACE_CHAR +
            VERSION_LABEL + EQUAL_CHAR + QUOTE_CHAR + XMLVERSIONNO_LABEL + QUOTE_CHAR + SPACE_CHAR +
            ENCODING_LABEL + EQUAL_CHAR + QUOTE_CHAR + Encoding1 + QUOTE_CHAR + SPACE_CHAR +
            STANDALONE_LABEL + EQUAL_CHAR + QUOTE_CHAR + BooleanToYesNo(doStandAlone In FOptions) + QUOTE_CHAR + XML_END + CRLF_CHARS);
        End Else Begin {If no encoding is given we do not place an encoding parameter in the header. Works better with some browsers}
          StringToStream(XML_BEGIN + SPACE_CHAR +
            VERSION_LABEL + EQUAL_CHAR + QUOTE_CHAR + XMLVERSIONNO_LABEL + QUOTE_CHAR + SPACE_CHAR +
            STANDALONE_LABEL + EQUAL_CHAR + QUOTE_CHAR + BooleanToYesNo(doStandAlone In FOptions) + QUOTE_CHAR + XML_END + CRLF_CHARS);
        End;
      End;  Procedure WriteGlobalSettings;
       Begin
         End;
      End;