147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org/*
247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *
447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  Use of this source code is governed by a BSD-style license
547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  that can be found in the LICENSE file in the root of the source
647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  tree. An additional intellectual property rights grant can be found
747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  in the file PATENTS.  All contributing project authors may
847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org *  be found in the AUTHORS file in the root of the source tree.
947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org */
1047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#ifndef WEBRTC_BASE_BYTEORDER_H_
1247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#define WEBRTC_BASE_BYTEORDER_H_
1347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_POSIX) && !defined(__native_client__)
1547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <arpa/inet.h>
1647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
1747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
1847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#if defined(WEBRTC_WIN)
1947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include <stdlib.h>
2047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif
2147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#include "webrtc/base/basictypes.h"
2347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orgnamespace rtc {
2547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
2647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Reading and writing of little and big-endian numbers from memory
2747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// TODO: Optimized versions, with direct read/writes of
2847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// integers in host-endian format, when the platform supports it.
2947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void Set8(void* memory, size_t offset, uint8 v) {
3147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static_cast<uint8*>(memory)[offset] = v;
3247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
3347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint8 Get8(const void* memory, size_t offset) {
3547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return static_cast<const uint8*>(memory)[offset];
3647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
3747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
3847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetBE16(void* memory, uint16 v) {
3947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 8));
4047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 0));
4147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
4347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetBE32(void* memory, uint32 v) {
4447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 24));
4547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 16));
4647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 2, static_cast<uint8>(v >> 8));
4747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 3, static_cast<uint8>(v >> 0));
4847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
4947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
5047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetBE64(void* memory, uint64 v) {
5147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 56));
5247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 48));
5347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 2, static_cast<uint8>(v >> 40));
5447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 3, static_cast<uint8>(v >> 32));
5547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 4, static_cast<uint8>(v >> 24));
5647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 5, static_cast<uint8>(v >> 16));
5747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 6, static_cast<uint8>(v >> 8));
5847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 7, static_cast<uint8>(v >> 0));
5947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint16 GetBE16(const void* memory) {
6247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return static_cast<uint16>((Get8(memory, 0) << 8) |
6347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             (Get8(memory, 1) << 0));
6447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
6547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
6647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint32 GetBE32(const void* memory) {
6747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return (static_cast<uint32>(Get8(memory, 0)) << 24) |
6847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 1)) << 16) |
6947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 2)) << 8) |
7047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 3)) << 0);
7147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
7247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
7347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint64 GetBE64(const void* memory) {
7447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return (static_cast<uint64>(Get8(memory, 0)) << 56) |
7547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 1)) << 48) |
7647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 2)) << 40) |
7747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 3)) << 32) |
7847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 4)) << 24) |
7947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 5)) << 16) |
8047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 6)) << 8) |
8147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 7)) << 0);
8247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetLE16(void* memory, uint16 v) {
8547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 0));
8647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 8));
8747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
8847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
8947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetLE32(void* memory, uint32 v) {
9047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 0));
9147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 8));
9247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 2, static_cast<uint8>(v >> 16));
9347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 3, static_cast<uint8>(v >> 24));
9447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
9547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
9647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline void SetLE64(void* memory, uint64 v) {
9747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 0, static_cast<uint8>(v >> 0));
9847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 1, static_cast<uint8>(v >> 8));
9947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 2, static_cast<uint8>(v >> 16));
10047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 3, static_cast<uint8>(v >> 24));
10147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 4, static_cast<uint8>(v >> 32));
10247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 5, static_cast<uint8>(v >> 40));
10347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 6, static_cast<uint8>(v >> 48));
10447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  Set8(memory, 7, static_cast<uint8>(v >> 56));
10547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
10647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
10747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint16 GetLE16(const void* memory) {
10847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return static_cast<uint16>((Get8(memory, 0) << 0) |
10947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org                             (Get8(memory, 1) << 8));
11047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
11147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint32 GetLE32(const void* memory) {
11347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return (static_cast<uint32>(Get8(memory, 0)) << 0) |
11447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 1)) << 8) |
11547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 2)) << 16) |
11647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint32>(Get8(memory, 3)) << 24);
11747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
11847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
11947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint64 GetLE64(const void* memory) {
12047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return (static_cast<uint64>(Get8(memory, 0)) << 0) |
12147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 1)) << 8) |
12247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 2)) << 16) |
12347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 3)) << 24) |
12447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 4)) << 32) |
12547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 5)) << 40) |
12647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 6)) << 48) |
12747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org      (static_cast<uint64>(Get8(memory, 7)) << 56);
12847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
12947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org// Check if the current host is big endian.
13147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline bool IsHostBigEndian() {
13247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  static const int number = 1;
13347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return 0 == *reinterpret_cast<const char*>(&number);
13447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
13547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
13647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint16 HostToNetwork16(uint16 n) {
13747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  uint16 result;
13847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetBE16(&result, n);
13947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return result;
14047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint32 HostToNetwork32(uint32 n) {
14347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  uint32 result;
14447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetBE32(&result, n);
14547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return result;
14647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
14747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
14847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint64 HostToNetwork64(uint64 n) {
14947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  uint64 result;
15047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  SetBE64(&result, n);
15147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return result;
15247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
15347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint16 NetworkToHost16(uint16 n) {
15547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetBE16(&n);
15647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
15747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
15847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint32 NetworkToHost32(uint32 n) {
15947be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetBE32(&n);
16047be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16147be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16247be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.orginline uint64 NetworkToHost64(uint64 n) {
16347be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org  return GetBE64(&n);
16447be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}
16547be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16647be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org}  // namespace rtc
16747be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org
16847be73b8629244d6bb63a28198f97f040ce53d21henrike@webrtc.org#endif  // WEBRTC_BASE_BYTEORDER_H_
169