1 // Copyright 2014 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "base/big_endian.h"
9 #include "base/numerics/checked_math.h"
10 #include "base/strings/string_piece.h"
14 BigEndianReader BigEndianReader::FromStringPiece(
15 base::StringPiece string_piece) {
16 return BigEndianReader(base::as_bytes(base::make_span(string_piece)));
19 BigEndianReader::BigEndianReader(const uint8_t* buf, size_t len)
20 : ptr_(buf), end_(ptr_ + len) {
21 // Ensure `len` does not cause `end_` to wrap around.
25 BigEndianReader::BigEndianReader(base::span<const uint8_t> buf)
26 : ptr_(buf.data()), end_(buf.data() + buf.size()) {}
28 bool BigEndianReader::Skip(size_t len) {
29 if (len > remaining())
35 bool BigEndianReader::ReadBytes(void* out, size_t len) {
36 if (len > remaining())
38 memcpy(out, ptr_, len);
43 bool BigEndianReader::ReadPiece(base::StringPiece* out, size_t len) {
44 if (len > remaining())
46 *out = base::StringPiece(reinterpret_cast<const char*>(ptr_), len);
51 bool BigEndianReader::ReadSpan(base::span<const uint8_t>* out, size_t len) {
52 if (len > remaining())
54 *out = base::make_span(ptr_, len);
60 bool BigEndianReader::Read(T* value) {
61 if (sizeof(T) > remaining())
63 ReadBigEndian<T>(ptr_, value);
68 bool BigEndianReader::ReadU8(uint8_t* value) {
72 bool BigEndianReader::ReadU16(uint16_t* value) {
76 bool BigEndianReader::ReadU32(uint32_t* value) {
80 bool BigEndianReader::ReadU64(uint64_t* value) {
85 bool BigEndianReader::ReadLengthPrefixed(base::StringPiece* out) {
89 size_t len = strict_cast<size_t>(t_len);
90 const uint8_t* original_ptr = ptr_;
95 *out = base::StringPiece(reinterpret_cast<const char*>(original_ptr), len);
99 bool BigEndianReader::ReadU8LengthPrefixed(base::StringPiece* out) {
100 return ReadLengthPrefixed<uint8_t>(out);
103 bool BigEndianReader::ReadU16LengthPrefixed(base::StringPiece* out) {
104 return ReadLengthPrefixed<uint16_t>(out);
107 BigEndianWriter::BigEndianWriter(char* buf, size_t len)
108 : ptr_(buf), end_(ptr_ + len) {
109 // Ensure `len` does not cause `end_` to wrap around.
110 CHECK_GE(end_, ptr_);
113 bool BigEndianWriter::Skip(size_t len) {
114 if (len > remaining())
120 bool BigEndianWriter::WriteBytes(const void* buf, size_t len) {
121 if (len > remaining())
123 memcpy(ptr_, buf, len);
129 bool BigEndianWriter::Write(T value) {
130 if (sizeof(T) > remaining())
132 WriteBigEndian<T>(ptr_, value);
137 bool BigEndianWriter::WriteU8(uint8_t value) {
141 bool BigEndianWriter::WriteU16(uint16_t value) {
145 bool BigEndianWriter::WriteU32(uint32_t value) {
149 bool BigEndianWriter::WriteU64(uint64_t value) {