private void writeRow(Row row, SenderType sender) { int count = (sender == SenderType.WRITE_HEADER) ? dHeader_Template.Length : row.Length; for (int c = 0; c < count; c++) { Cell cell = (sender == SenderType.WRITE_HEADER) ? dHeader_Template[c] : row_Template[c]; switch (cell.Type) { case CellType.TYPE_INT_16: goto case CellType.TYPE_SHORT; case CellType.TYPE_SHORT: { short s = row[c] as short? ?? default(short); sHelper.WriteInt16(s); } break; case CellType.TYPE_USHORT: goto case CellType.TYPE_UINT_16; case CellType.TYPE_UINT_16: { ushort s = row[c] as ushort? ?? default(ushort); sHelper.WriteUInt16(s); } break; case CellType.TYPE_INT: goto case CellType.TYPE_INT_32; case CellType.TYPE_INT_32: { int i = row[c] as int? ?? default(int); sHelper.WriteInt32(i); } break; case CellType.TYPE_UINT_32: { uint i = Convert.ToUInt32(row[c]); sHelper.WriteUInt32(i); } break; case CellType.TYPE_INT_64: goto case CellType.TYPE_LONG; case CellType.TYPE_LONG: { long l = row[c] as long? ?? default(long); sHelper.WriteDouble(l); } break; //TODO: Implement TYPE_ULONG //case CellType.TYPE_ULONG: // break; case CellType.TYPE_BYTE: if (cell.Length > 0) { byte[] b = new byte[cell.Length]; sHelper.WriteBytes(b); } else { byte b = row[c] as byte? ?? default(byte); sHelper.WriteByte(b); } break; case CellType.TYPE_BIT_VECTOR: { int i = BitConverter.ToInt32(generateBitVector(row, cell.Name), 0); sHelper.WriteInt32(i); } break; case CellType.TYPE_DECIMAL: //int v0 = sHelper.ReadInt32; //decimal v1 = v0 / 100m; //row[c] = v1; decimal v0 = row[c] as decimal? ?? default(decimal); int v1 = Convert.ToInt32(v0 * 100); sHelper.WriteInt32(v1); break; case CellType.TYPE_FLOAT: goto case CellType.TYPE_SINGLE; case CellType.TYPE_FLOAT_32: goto case CellType.TYPE_SINGLE; case CellType.TYPE_SINGLE: { float s = row[c] as float? ?? default(float); sHelper.WriteSingle(s); } break; case CellType.TYPE_FLOAT_64: goto case CellType.TYPE_DOUBLE; case CellType.TYPE_DOUBLE: { double d = row[c] as double? ?? default(double); sHelper.WriteDouble(d); } break; case CellType.TYPE_STRING: { string s = row[c].ToString() + '\0'; sHelper.WriteString(s, s.Length); } break; case CellType.TYPE_STRING_BY_LEN: goto case CellType.TYPE_STRING; case CellType.TYPE_STRING_BY_HEADER_REF: { byte[] buffer = ByteConverterExt.ToBytes(row[c].ToString(), Encoding.Default); string refName = cell.Dependency; int remainder = Convert.ToInt32(dHeader[refName]) - buffer.Length; sHelper.WriteBytes(buffer); sHelper.WriteBytes(new byte[remainder]); } break; case CellType.TYPE_STRING_LEN: { string cellName = row.GetNameByDependency(cell.Name); int valLen = row[cellName].ToString().Length + 1; sHelper.WriteInt32(valLen); } break; } } }