Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- byte-6
- bit0 - original_or_copy
- bit1 - copyright
- bit2 - data_alignment_indicator
- bit3 - PES_priority
- bit4-bit5 - PES_scrambling control.
- bit6-bit7 - reserved
- struct PESHeader {
- unsigned reserved:2;
- unsigned scrambling_control:2;
- unsigned priority:1;
- unsigned data_alignment_indicator:1;
- unsigned copyright:1;
- unsigned original_or_copy:1;
- };
- using System;
- namespace BitfieldTest
- {
- [global::System.AttributeUsage(AttributeTargets.Field, AllowMultiple = false)]
- sealed class BitfieldLengthAttribute : Attribute
- {
- uint length;
- public BitfieldLengthAttribute(uint length)
- {
- this.length = length;
- }
- public uint Length { get { return length; } }
- }
- static class PrimitiveConversion
- {
- public static long ToLong<T>(T t) where T : struct
- {
- long r = 0;
- int offset = 0;
- // For every field suitably attributed with a BitfieldLength
- foreach (System.Reflection.FieldInfo f in t.GetType().GetFields())
- {
- object[] attrs = f.GetCustomAttributes(typeof(BitfieldLengthAttribute), false);
- if (attrs.Length == 1)
- {
- uint fieldLength = ((BitfieldLengthAttribute)attrs[0]).Length;
- // Calculate a bitmask of the desired length
- long mask = 0;
- for (int i = 0; i < fieldLength; i++)
- mask |= 1 << i;
- r |= ((UInt32)f.GetValue(t) & mask) << offset;
- offset += (int)fieldLength;
- }
- }
- return r;
- }
- }
- struct PESHeader
- {
- [BitfieldLength(2)]
- public uint reserved;
- [BitfieldLength(2)]
- public uint scrambling_control;
- [BitfieldLength(1)]
- public uint priority;
- [BitfieldLength(1)]
- public uint data_alignment_indicator;
- [BitfieldLength(1)]
- public uint copyright;
- [BitfieldLength(1)]
- public uint original_or_copy;
- };
- public class MainClass
- {
- public static void Main(string[] args)
- {
- PESHeader p = new PESHeader();
- p.reserved = 3;
- p.scrambling_control = 2;
- p.data_alignment_indicator = 1;
- long l = PrimitiveConversion.ToLong(p);
- for (int i = 63; i >= 0; i--)
- {
- Console.Write( ((l & (1l << i)) > 0) ? "1" : "0");
- }
- Console.WriteLine();
- return;
- }
- }
- }
- [StructLayout(LayoutKind.Explicit, Size=1, CharSet=CharSet.Ansi)]
- public struct Foo
- { [FieldOffset(0)]public byte original_or_copy;
- [FieldOffset(0)]public byte copyright;
- [FieldOffset(0)]public byte data_alignment_indicator;
- [FieldOffset(0)]public byte PES_priority;
- [FieldOffset(0)]public byte PES_scrambling_control;
- [FieldOffset(0)]public byte reserved;
- }
- const byte _original_or_copy = 1;
- const byte _copyright = 2;
- //bool ooo = foo.original_or_copy();
- static bool original_or_copy(this Foo foo)
- { return (foo.original_or_copy & _original_or_copy) == original_or_copy;
- }
- [Flags]
- public enum PESHeaderFlags
- {
- IsCopy = 1, // implied that if not present, then it is an original
- IsCopyrighted = 2,
- IsDataAligned = 4,
- Priority = 8,
- ScramblingControlType1 = 0,
- ScramblingControlType2 = 16,
- ScramblingControlType3 = 32,
- ScramblingControlType4 = 16+32,
- ScramblingControlFlags = ScramblingControlType1 | ScramblingControlType2 | ... ype4
- etc.
- }
- [Flags] enum PesHeaders : byte { /* ... */ }
Add Comment
Please, Sign In to add comment