public static string GetStringValue(ArraySegment <byte> arraySegment, DataType dataType) { var subArray = arraySegment.Array.Skip(arraySegment.Offset).Take(arraySegment.Count).ToArray(); switch (dataType) { // Avl Data types case DataType.CodecId: case DataType.AvlDataCount: case DataType.Priority: case DataType.Satellites: case DataType.EventIoId: case DataType.IoCount: case DataType.IoCount1B: case DataType.IoId1B: case DataType.IoValue1B: case DataType.IoCount2B: case DataType.IoId2B: case DataType.IoCount4B: case DataType.IoId4B: case DataType.IoCount8B: case DataType.IoId8B: return(subArray[0].ToString()); case DataType.Latitude: case DataType.Longitude: return(BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0)).ToString()); case DataType.IoValue4B: return(GetSignedUnsigned32(subArray)); case DataType.Altitude: case DataType.Angle: case DataType.Speed: return(BytesSwapper.Swap(BitConverter.ToInt16(subArray, 0)).ToString()); case DataType.IoValue2B: return(GetSignedUnsigned16(subArray)); case DataType.IoValue8B: return(GetSignedUnsigned64(subArray)); case DataType.Timestamp: return(AvlEpoch.AddMilliseconds(BytesSwapper.Swap(BitConverter.ToInt64(subArray, 0))).ToString()); // Codec7 types case DataType.TimestampGh: { var priorityAndTimeStamp = BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0)); var timeStamp = (long)(priorityAndTimeStamp & 0x3FFFFFFF); return(GHepoch.AddSeconds(timeStamp).ToString()); } case DataType.PriorityGh: { string priorityAndTimestampBits = string.Join(" ", subArray.Select(x => Convert.ToString(x, 2).PadLeft(8, '0'))); return(((GhAvlDataPriority)Convert.ToInt16(priorityAndTimestampBits.Substring(0, 2))).ToString()); } case DataType.GlobalMask: return(((GlobalMaskCodec7)subArray[0]).ToString()); case DataType.GpsElementMask: return(((GpsElementMaskCodec7)subArray[0]).ToString()); case DataType.LongitudeGh: case DataType.LatitudeGh: { var coordinate = EndianBitConverter.ToSingle(subArray, 0); if (!GpsElement.IsLatValid(coordinate)) { return(0.ToString()); } return(coordinate.ToString()); } case DataType.AngleGh: case DataType.SpeedGh: return(subArray[0].ToString()); case DataType.CellIdAndLocalAreaGh: case DataType.OperatorCodeGh: return(BytesSwapper.Swap(BitConverter.ToInt32(subArray, 0)).ToString()); case DataType.SignalQualityGh: return(subArray[0].ToString()); // Tcp types case DataType.Preamble: case DataType.AvlDataArrayLength: case DataType.Crc: return(GetSignedUnsigned32(subArray)); // Udp types case DataType.Length: case DataType.PacketId: case DataType.ImeiLength: return(GetSignedUnsigned16(subArray)); case DataType.PacketType: case DataType.AvlPacketId: return(subArray[0].ToString()); case DataType.Imei: return(Encoding.UTF8.GetString(subArray)); default: throw new ArgumentOutOfRangeException(); } }
/// <summary> /// Decode Gps element /// </summary> /// <returns></returns> private GpsElementExt DecodeGpsElement() { var mask = (GpsElementMaskCodec7)_reader.ReadByte(); float x = 0; float y = 0; if (mask.HasFlag(GpsElementMaskCodec7.Coordinates)) { var lat = EndianBitConverter.Int32ToSingle(_reader.ReadInt32()); var lng = EndianBitConverter.Int32ToSingle(_reader.ReadInt32()); if (!GpsElement.IsLatValid(lat)) { lat = 0; } if (!GpsElement.IsLngValid(lng)) { lng = 0; } y = lat; x = lng; } short altitude = 0; if (mask.HasFlag(GpsElementMaskCodec7.Altitude)) { altitude = _reader.ReadInt16(); } short angle = 0; if (mask.HasFlag(GpsElementMaskCodec7.Angle)) { angle = (short)Math.Round(((double)_reader.ReadByte() * 360 / 256)); } short speed = 0; if (mask.HasFlag(GpsElementMaskCodec7.Speed)) { speed = _reader.ReadByte(); } var satellites = mask.HasFlag(GpsElementMaskCodec7.Satellites) ? _reader.ReadByte() : (byte)3; var properties = new List <IoProperty>(3); if (mask.HasFlag(GpsElementMaskCodec7.CellId)) { var cellId = _reader.ReadInt32(); properties.Add(IoProperty.Create(Constants.CellIdPropertyId, cellId)); } if (mask.HasFlag(GpsElementMaskCodec7.SignalQuality)) { var signalQuality = _reader.ReadByte(); properties.Add(IoProperty.Create(Constants.SignalQualityPropertyId, signalQuality)); } if (mask.HasFlag(GpsElementMaskCodec7.OperatorCode)) { var code = _reader.ReadInt32(); properties.Add(IoProperty.Create(Constants.OperatorCodePropertyId, code)); } // set the N/A position if it's not available if (x == 0 && y == 0) { speed = GpsElement.InvalidGpsSpeed; satellites = 0; } var gps = GpsElement.Create(x, y, altitude, speed, angle, satellites); var io = IoElement.Create(0, properties.Count, properties); return(new GpsElementExt(gps: gps, io: io)); }