big.ha (1879B)
1 // SPDX-License-Identifier: MPL-2.0 2 // (c) Hare authors <https://harelang.org> 3 4 // Reads a u16 from a buffer in big-endian order. 5 export fn begetu16(buf: []u8) u16 = { 6 return 7 (buf[0] << 8u16) | 8 (buf[1] << 0); 9 }; 10 11 // Writes a u16 into a buffer in big-endian order. 12 export fn beputu16(buf: []u8, in: u16) void = { 13 buf[1] = (in >> 0): u8; 14 buf[0] = (in >> 8): u8; 15 }; 16 17 // Reads a u32 from a buffer in big-endian order. 18 export fn begetu32(buf: []u8) u32 = { 19 return 20 (buf[0] << 24u32) | 21 (buf[1] << 16u32) | 22 (buf[2] << 8u32) | 23 (buf[3] << 0); 24 }; 25 26 // Writes a u32 into a buffer in big-endian order. 27 export fn beputu32(buf: []u8, in: u32) void = { 28 buf[3] = (in >> 0): u8; 29 buf[2] = (in >> 8): u8; 30 buf[1] = (in >> 16): u8; 31 buf[0] = (in >> 24): u8; 32 }; 33 34 // Reads a u64 from a buffer in big-endian order. 35 export fn begetu64(buf: []u8) u64 = { 36 return 37 (buf[0] << 56u64) | 38 (buf[1] << 48u64) | 39 (buf[2] << 40u64) | 40 (buf[3] << 32u64) | 41 (buf[4] << 24u64) | 42 (buf[5] << 16u64) | 43 (buf[6] << 8u64) | 44 (buf[7] << 0); 45 }; 46 47 // Writes a u64 into a buffer in big-endian order. 48 export fn beputu64(buf: []u8, in: u64) void = { 49 buf[7] = (in >> 0): u8; 50 buf[6] = (in >> 8): u8; 51 buf[5] = (in >> 16): u8; 52 buf[4] = (in >> 24): u8; 53 buf[3] = (in >> 32): u8; 54 buf[2] = (in >> 40): u8; 55 buf[1] = (in >> 48): u8; 56 buf[0] = (in >> 56): u8; 57 }; 58 59 @test fn big() void = { 60 let buf: [8]u8 = [0...]; 61 beputu16(buf, 0x1234); 62 assert(buf[0] == 0x12 && buf[1] == 0x34); 63 assert(begetu16(buf) == 0x1234); 64 65 beputu32(buf, 0x12345678); 66 assert(buf[0] == 0x12 && buf[1] == 0x34 67 && buf[2] == 0x56 && buf[3] == 0x78); 68 assert(begetu32(buf) == 0x12345678); 69 70 beputu64(buf, 0x1234567887654321); 71 assert(buf[0] == 0x12 && buf[1] == 0x34 72 && buf[2] == 0x56 && buf[3] == 0x78 73 && buf[4] == 0x87 && buf[5] == 0x65 74 && buf[6] == 0x43 && buf[7] == 0x21); 75 assert(begetu64(buf) == 0x1234567887654321); 76 };