D:/work/code_by/IOStream/ByteArrayOutputStream.cpp

查看本檔案說明文件.
00001 #include <mem.h>
00002 #include "ByteArrayOutputStream.h"
00003 
00004 TByteArrayOutputStream::TByteArrayOutputStream()
00005 {
00006   List = new TMyList();
00007   bufferSize = 1024;
00008   totalSize = writeSize = 0;
00009 }
00010 
00011 TByteArrayOutputStream::TByteArrayOutputStream(int size)
00012 {
00013   List = new TMyList();
00014   bufferSize = size;
00015   totalSize = writeSize = 0;
00016 }
00017 
00018 TByteArrayOutputStream::~TByteArrayOutputStream()
00019 {
00020   Reset();
00021   delete List;
00022 }
00023 
00024 void TByteArrayOutputStream::Reset(void)
00025 {
00026   int i;
00027 
00028   for (i = List->count - 1; i >= 0; i--)
00029     delete[] (unsigned char *)List->Items(i);
00030   List->Clear();
00031   totalSize = writeSize = 0;
00032 }
00033 
00034 int TByteArrayOutputStream::Size(void)
00035 {
00036   return totalSize;
00037 }
00038 
00039 int TByteArrayOutputStream::ToByteArray(void *dst)
00040 {
00041   return ToByteArray(dst, 0, totalSize);
00042 }
00043 
00044 int TByteArrayOutputStream::ToByteArray(void *dst, int from, int size)
00045 {
00046   unsigned char *p;
00047   int i, n, result;
00048 
00049   if (from >= totalSize)
00050     return 0;
00051 
00052   p = (unsigned char *)dst;
00053   result = from + size > totalSize? totalSize - from : size;  //複製的byte數
00054 
00055   i = from / bufferSize;  //從此buffer開始
00056   n = bufferSize - from % bufferSize;  //頭一個buffer要複製的byte數
00057   if (n >= result)
00058     n = result;
00059   memcpy(p, (unsigned char *)List->Items(i) + from % bufferSize, n);  //複製此buffer的後面n個byte
00060 
00061   if (n == result)  //複製完畢
00062     return result;
00063   p += n;
00064   size = result - n;
00065 
00066   while (size > bufferSize)
00067   {
00068     memcpy(p, List->Items(++i), bufferSize);
00069     p += bufferSize;
00070     size -= bufferSize;
00071   }
00072   memcpy(p, List->Items(i + 1), size);  //複製此buffer的前面size個byte
00073 
00074   return result;
00075 }
00076 
00077 void TByteArrayOutputStream::Write(int n)
00078 {
00079   static unsigned char *buffer = NULL;
00080 
00081   if (writeSize < bufferSize)
00082   {
00083     if (totalSize == 0)
00084       List->Add(buffer = new unsigned char[bufferSize]);
00085     buffer[writeSize++] = n;
00086   }
00087   else
00088   {
00089     List->Add(buffer = new unsigned char[bufferSize]);
00090     buffer[0] = n;
00091     writeSize = 1;
00092   }
00093   ++totalSize;
00094 }
00095 
00096 void TByteArrayOutputStream::WriteTo(TOutputStream *Stream)
00097 {
00098   int i;
00099 
00100   if (totalSize == 0)
00101     return;
00102     
00103   for (i = 0; i < List->count - 1; i++)
00104     Stream->Writes(List->Items(i), bufferSize);
00105   Stream->Writes(List->Items(i), totalSize - bufferSize * (List->count - 1));
00106 }
00107 

產生日期:Tue Jul 11 11:52:19 2006, 專案:cbmr, 產生器:  doxygen 1.4.7