kafka/clients/csharp/src/Kafka/Kafka.Client/Serialization/KafkaBinaryReader.cs

132 lines
4.6 KiB
C#

/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Kafka.Client.Serialization
{
using System.IO;
using System.Net;
using System.Text;
/// <summary>
/// Reads data from underlying stream using big endian bytes order for primitive types
/// and UTF-8 encoding for strings.
/// </summary>
public class KafkaBinaryReader : BinaryReader
{
/// <summary>
/// Initializes a new instance of the <see cref="KafkaBinaryReader"/> class
/// using big endian bytes order for primive types and UTF-8 encoding for strings.
/// </summary>
/// <param name="input">
/// The input stream.
/// </param>
public KafkaBinaryReader(Stream input)
: base(input)
{
}
/// <summary>
/// Resets position pointer.
/// </summary>
/// <param name="disposing">
/// Not used
/// </param>
protected override void Dispose(bool disposing)
{
this.BaseStream.Position = 0;
}
/// <summary>
/// Reads two-bytes signed integer from the current stream using big endian bytes order
/// and advances the stream position by two bytes
/// </summary>
/// <returns>
/// The two-byte signed integer read from the current stream.
/// </returns>
public override short ReadInt16()
{
short value = base.ReadInt16();
short currentOrdered = IPAddress.NetworkToHostOrder(value);
return currentOrdered;
}
/// <summary>
/// Reads four-bytes signed integer from the current stream using big endian bytes order
/// and advances the stream position by four bytes
/// </summary>
/// <returns>
/// The four-byte signed integer read from the current stream.
/// </returns>
public override int ReadInt32()
{
int value = base.ReadInt32();
int currentOrdered = IPAddress.NetworkToHostOrder(value);
return currentOrdered;
}
/// <summary>
/// Reads eight-bytes signed integer from the current stream using big endian bytes order
/// and advances the stream position by eight bytes
/// </summary>
/// <returns>
/// The eight-byte signed integer read from the current stream.
/// </returns>
public override long ReadInt64()
{
long value = base.ReadInt64();
long currentOrdered = IPAddress.NetworkToHostOrder(value);
return currentOrdered;
}
/// <summary>
/// Reads four-bytes signed integer from the current stream using big endian bytes order
/// and advances the stream position by four bytes
/// </summary>
/// <returns>
/// The four-byte signed integer read from the current stream.
/// </returns>
public override int Read()
{
int value = base.Read();
int currentOrdered = IPAddress.NetworkToHostOrder(value);
return currentOrdered;
}
/// <summary>
/// Reads fixed-length topic from underlying stream using given encoding.
/// </summary>
/// <param name="encoding">
/// The encoding to use.
/// </param>
/// <returns>
/// The read topic.
/// </returns>
public string ReadTopic(string encoding)
{
short length = this.ReadInt16();
if (length == -1)
{
return null;
}
var bytes = this.ReadBytes(length);
Encoding encoder = Encoding.GetEncoding(encoding);
return encoder.GetString(bytes);
}
}
}