示例#1
0
文件: Base64.cs 项目: ywscr/SpanNetty
 public static IByteBuffer Encode(IByteBuffer src, bool breakLines, IBase64Dialect dialect) => Encode(src, src.ReaderIndex, src.ReadableBytes, breakLines, dialect);
示例#2
0
文件: Base64.cs 项目: ywscr/SpanNetty
 public static IByteBuffer Encode(IByteBuffer src, int offset, int length, bool breakLines, IBase64Dialect dialect) => Encode(src, offset, length, breakLines, dialect, src.Allocator);
示例#3
0
文件: Base64.cs 项目: ywscr/SpanNetty
        public static unsafe IByteBuffer Decode(IByteBuffer src, int offset, int length, IBase64Dialect dialect, IByteBufferAllocator allocator)
        {
            if (src is null)
            {
                CThrowHelper.ThrowArgumentNullException(CExceptionArgument.src);
            }
            //if (dialect.Decodabet is null)
            //{
            //    CThrowHelper.ThrowArgumentNullException(CExceptionArgument.dialect_decodabet);
            //}
            if ((offset < src.ReaderIndex) || (offset + length > src.WriterIndex /*src.ReaderIndex + src.ReadableBytes*/))
            {
                CThrowHelper.ThrowArgumentOutOfRangeException(CExceptionArgument.offset);
            }
            Debug.Assert(dialect.Decodabet.Length == 256, "decodabet.Length must be 256!");
            if ((uint)(length - 1) > SharedConstants.TooBigOrNegative)
            {
                return(Unpooled.Empty);
            }

            int         outLength = length * 3 / 4;
            IByteBuffer dest      = allocator.Buffer(outLength);
            int         charCount = 0;
            int         destIndex = dest.WriterIndex;

            fixed(sbyte *decodabet = &MemoryMarshal.GetReference(dialect.Decodabet))
            {
                if (src.IsSingleIoBuffer && dest.IsSingleIoBuffer)
                {
                    charCount = DecodeUsingPointer(src, dest, decodabet, offset, length);
                }
                else
                {
                    charCount = DecodeUsingGetSet(src, dest, decodabet, offset, length);
                }
            }

            return(dest.SetIndex(destIndex, destIndex + charCount));
        }
示例#4
0
文件: Base64.cs 项目: ywscr/SpanNetty
 public static IByteBuffer Encode(IByteBuffer src, IBase64Dialect dialect) => Encode(src, src.ReaderIndex, src.ReadableBytes, dialect.BreakLinesByDefault, dialect);
示例#5
0
文件: Base64.cs 项目: ywscr/SpanNetty
 public static IByteBuffer Decode(IByteBuffer src, int offset, int length, IBase64Dialect dialect) => Decode(src, offset, length, dialect, src.Allocator);
示例#6
0
文件: Base64.cs 项目: ywscr/SpanNetty
 public static IByteBuffer Decode(IByteBuffer src, IBase64Dialect dialect) => Decode(src, src.ReaderIndex, src.ReadableBytes, dialect);
示例#7
0
文件: Base64.cs 项目: ywscr/SpanNetty
        public static unsafe IByteBuffer Encode(IByteBuffer src, int offset, int length, bool breakLines, IBase64Dialect dialect, IByteBufferAllocator allocator)
        {
            if (src is null)
            {
                CThrowHelper.ThrowArgumentNullException(CExceptionArgument.src);
            }
            //if (dialect.alphabet is null)
            //{
            //    CThrowHelper.ThrowArgumentNullException(CExceptionArgument.dialect_alphabet);
            //}
            Debug.Assert(dialect.Alphabet.Length == 64, "alphabet.Length must be 64!");
            if ((offset < src.ReaderIndex) || (offset + length > src.WriterIndex /*src.ReaderIndex + src.ReadableBytes*/))
            {
                CThrowHelper.ThrowArgumentOutOfRangeException(CExceptionArgument.offset);
            }
            if ((uint)(length - 1) > SharedConstants.TooBigOrNegative)
            {
                return(Unpooled.Empty);
            }

            int remainderLength = length % 3;
            int outLength       = length / 3 * 4 + (remainderLength > 0 ? 4 : 0);

            outLength += breakLines ? outLength / MAX_LINE_LENGTH : 0;
            IByteBuffer dest       = allocator.Buffer(outLength);
            int         destLength = 0;
            int         destIndex  = dest.WriterIndex;

            fixed(byte *alphabet = &MemoryMarshal.GetReference(dialect.Alphabet))
            {
                if (src.IsSingleIoBuffer && dest.IsSingleIoBuffer)
                {
                    destLength = EncodeUsingPointer(alphabet, src, dest, offset, length, breakLines);
                }
                else
                {
                    destLength = EncodeUsingGetSet(alphabet, src, dest, offset, length, breakLines);
                }
            }

            return(dest.SetIndex(destIndex, destIndex + destLength));
        }
示例#8
0
 public Base64Decoder(IBase64Dialect dialect)
 {
     this.dialect = dialect;
 }
示例#9
0
 public Base64Encoder(bool breakLines, IBase64Dialect dialect)
 {
     this.breakLines = breakLines;
     this.dialect    = dialect;
 }