Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdint.h>
- typedef union {
- uint32_t data;
- struct {
- uint32_t version: 4;
- uint32_t ihl: 4;
- uint32_t dscp: 6;
- uint32_t ecn: 2;
- uint32_t total_len: 16;
- } un;
- } ip_v4;
- ip_v4 new_ipv4(const uint32_t ipv4_number) {
- ip_v4 ip;
- ip.data = ipv4_number;
- return ip;
- }
- int main() {
- const ip_v4 ip = new_ipv4(32);
- printf("version: %u, ihl: %u, dscp: %u, ecn: %u, total len: %u, size: %lu", ip.un.version, ip.un.ihl, ip.un.dscp, ip.un.ecn, ip.un.total_len, sizeof(ip_v4));
- return 0;
- }
- /* 1 Union Solution
- #include <stdio.h>
- #include <stdint.h>
- typedef union {
- uint32_t version: 4;
- uint32_t ihl: 4;
- uint32_t dscp: 6;
- uint32_t ecn: 2;
- uint32_t total_len: 16;
- } ip_v4;
- ip_v4 new_ipv4(const uint32_t ipv4_number) {
- ip_v4 ip;
- ip.version = ipv4_number >> (16 + 2 + 6 + 4);
- ip.ihl = (ipv4_number << 4) >> (6 + 2 + 16);
- ip.dscp = (ipv4_number << (4 + 4)) >> (2 + 16);
- ip.ecn = (ipv4_number << (4 + 4 + 6)) >> (16);
- ip.total_len = ipv4_number << (4 + 4 + 6 + 2);
- return ip;
- }
- int main() {
- const ip_v4 ip = new_ipv4(32);
- printf("version: %u, ihl: %u, dscp: %u, ecn: %u, total len: %u, size: %lu", ip.version, ip.ihl, ip.dscp, ip.ecn, ip.total_len, sizeof(ip_v4));
- return 0;
- }
- */
Advertisement