Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use Value::*;
- #[derive(Debug)]
- enum Value {
- I(i64),
- }
- #[derive(Debug)]
- enum Error {
- NotEnoughData,
- InvalidInteger,
- }
- fn read_int(mut buf: &[u8], size_in_bytes: usize) -> Result<Value, Error> {
- let mut acc = 0;
- for _ in 0..size_in_bytes {
- if buf.is_empty() { return Err(Error::NotEnoughData) }
- acc <<= 8;
- acc |= buf[0] as i64;
- buf = &buf[1..];
- }
- Ok(I(acc))
- }
- fn cbor_decode(buf: &[u8]) -> Result<Value, Error> {
- match buf[0] {
- 0x00 ... 0x17 => Ok(I(buf[0] as i64)),
- 0x18 ... 0x1b => read_int(&buf[1..], (buf[0] - 0x17) as usize),
- _ => Err(Error::InvalidInteger),
- }
- }
- fn main() {
- let x = [0x1a, 1, 0, 0];
- let y = cbor_decode(&x);
- println!("{:?}", y);
- }
- extern crate byteorder;
- use byteorder::{ByteOrder, BigEndian};
- fn read_int(buf: &[u8], size_in_bytes: usize) -> Result<Value, Error> {
- if buf.len() < size_in_bytes {
- Err(Error::NotEnoughData)
- } else {
- Ok(I(BigEndian::read_int(buf, size_in_bytes)))
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement