Skip to content

Raw

The raw codec is the most fundamental codec in Binary Codec. It handles raw binary data as Uint8Array and serves as the foundation for other codecs like string.

Overview

  • Type: 'raw'
  • Returns: Uint8Array
  • Dependencies: None (foundation codec)
  • Use Cases: Binary data, byte arrays, building blocks for other codecs

Basic Usage

ts
import type { 
CodecSpec
} from 'binary-codec';
import {
deserialize
,
serialize
} from 'binary-codec';
const
spec
= {
byteLength
: 6,
fields
: [
{
name
: 'payload',
type
: 'raw',
byteOffset
: 0,
byteLength
: 6
} ] } as
const
satisfies
CodecSpec
;
// Create some binary data const
data
= {
payload
: new
Uint8Array
([0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF])
}; // Serialize to buffer const
buffer
=
serialize
(
spec
,
data
);
// Deserialize back - hover over result to see the type const
result
=
deserialize
(
spec
,
buffer
);
console
.
log
(
result
.
payload
); // Uint8Array(6) [170, 187, 204, 221, 238, 255]

Field Properties

PropertyTypeRequiredDescription
namestringField identifier
type'raw'Must be 'raw'
byteOffsetnumberPosition in buffer (0-based)
byteLengthnumberNumber of bytes to read/write (must be > 0)
ts
import type { 
CodecSpec
} from 'binary-codec';
const
spec
= {
byteLength
: 10,
fields
: [
{
name
: 'data', // Field identifier
type
: 'raw', // Codec type
byteOffset
: 2, // Start at byte 2
byteLength
: 8 // Read 8 bytes
} ] } as
const
satisfies
CodecSpec
;

Memory Sharing

Important

The raw codec returns a view of the original buffer, not a copy. Modifying the returned Uint8Array will modify the original buffer:

ts
import type { 
CodecSpec
} from 'binary-codec';
import {
deserialize
} from 'binary-codec';
const
spec
= {
byteLength
: 4,
fields
: [
{
name
: 'bytes',
type
: 'raw',
byteOffset
: 0,
byteLength
: 4
} ] } as
const
satisfies
CodecSpec
;
const
buffer
= new
Uint8Array
([0x01, 0x02, 0x03, 0x04]);
const
result
=
deserialize
(
spec
,
buffer
);
// Modifying the result affects the original buffer
result
.
bytes
[0] = 0xFF;
console
.
log
(
buffer
[0]); // 255 (0xFF)

Error Handling

The raw codec performs validation at different stages:

Specification Validation

This validation occurs during both deserialization and serialization:

Error CodeLevelDescription
INVALID_RAW_LENGTHFATALField byteLength must be positive (> 0)
ts
import type { 
CodecSpec
} from 'binary-codec';
import {
deserialize
} from 'binary-codec';
// ❌ This spec will cause FATAL validation error in both operations const
invalidSpec
= {
byteLength
: 4,
fields
: [
{
name
: 'data',
type
: 'raw',
byteOffset
: 0,
byteLength
: 0 // INVALID_RAW_LENGTH: must be > 0
} ] } as
const
satisfies
CodecSpec
;
// const buffer = new Uint8Array(4) // const result = deserialize(invalidSpec, buffer) // Throws ValidationError

Data Validation

This validation occurs only during serialization:

Error CodeLevelDescription
INVALID_RAW_DATA_TYPEFATALData must be Uint8Array
RAW_DATA_LENGTH_MISMATCHERRORData length must match byteLength
ts
import type { 
CodecSpec
} from 'binary-codec';
import {
serialize
} from 'binary-codec';
const
spec
= {
byteLength
: 4,
fields
: [
{
name
: 'data',
type
: 'raw',
byteOffset
: 0,
byteLength
: 4
} ] } as
const
satisfies
CodecSpec
;
// ❌ INVALID_RAW_DATA_TYPE: not Uint8Array // const result1 = serialize(spec, { data: [1, 2, 3, 4] }) // ❌ RAW_DATA_LENGTH_MISMATCH: wrong length // const result2 = serialize(spec, { data: new Uint8Array([1, 2]) }) // ✅ Valid data const
result
=
serialize
(
spec
, {
data
: new
Uint8Array
([1, 2, 3, 4])
});

Real-World Examples

File Header

ts
import type { 
CodecSpec
} from 'binary-codec';
import {
deserialize
} from 'binary-codec';
const
fileHeaderSpec
= {
byteLength
: 16,
fields
: [
{
name
: 'signature',
type
: 'raw',
byteOffset
: 0,
byteLength
: 4
}, {
name
: 'reserved',
type
: 'raw',
byteOffset
: 4,
byteLength
: 12
} ] } as
const
satisfies
CodecSpec
;
// Create buffer with PNG signature + 12 zero bytes const
buffer
= new
Uint8Array
(16);
buffer
.
set
([0x89, 0x50, 0x4E, 0x47], 0); // PNG signature
const
header
=
deserialize
(
fileHeaderSpec
,
buffer
);
// Check PNG signature const
pngSignature
= [0x89, 0x50, 0x4E, 0x47];
const
isPNG
=
Array
.
from
(
header
.
signature
).
every
((
byte
,
i
) =>
byte
===
pngSignature
[
i
]);

Cryptographic Hash

ts
import type { 
CodecSpec
} from 'binary-codec';
const
hashSpec
= {
byteLength
: 32,
fields
: [
{
name
: 'sha256',
type
: 'raw',
byteOffset
: 0,
byteLength
: 32
} ] } as
const
satisfies
CodecSpec
;
// Type is automatically inferred as { sha256: Uint8Array }

Next Steps

Now that you understand the raw codec, learn about codecs that build upon it:

Released under the MIT License.