# bytes 二进制字节库

## 功能

`bytes(value, mode)` 创建不可变 Bytes 值，用于串口、TCP、UDP、WebSocket、Modbus 等二进制数据边界。

Bytes 不会隐式按 UTF-8 lossy 转字符串。`json(bytes(...))` 输出带类型标记的 Base64 对象：`{"type":"bytes","encoding":"base64","data":"..."}`。

## 语法

```bt
bytes(value, mode)
```

## 参数

| 参数 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|------|------|
| value | String/Array/Bytes/Object | 否 | 空 Bytes | 字节来源。String 默认按 UTF-8 编码；Array 元素必须是 0 到 255；Bytes 直接复用；Object 可使用 `hex`、`base64`、`text` 或 `data` 字段。 |
| mode | String | 否 | `text` | String 输入的解析模式。可选 `text`、`utf8`、`hex`、`base64`、`base64_url`。 |

## value 对象字段

当 `value` 传入 Object 时，会按下表顺序读取第一个存在的字段：`hex`、`base64`、`text`、`data`。如果这些字段都不存在，返回空 Bytes。

| 字段 | 类型 | 必填 | 默认值 | 说明 |
|------|------|------|------|------|
| hex | String | 否 | 无 | 十六进制文本。允许空白符、`_`、`-`、`:`、`,` 作为分隔符；有效十六进制位数必须为偶数。 |
| base64 | String | 否 | 无 | Base64 文本。可配合 `mode` 字段选择编码表。 |
| mode | String/Int | 否 | 标准 Base64 | 仅在 `base64` 字段存在时使用。String 支持 `standard_no_pad`、`no_pad`、`url_safe`、`url_safe_no_pad`；Int 支持 `1` 标准无补位、`2` URL 安全、`3` URL 安全无补位。 |
| text | Any | 否 | 无 | 按字符串形式转为 UTF-8 字节。 |
| data | String/Array/Bytes/Empty/Null/Any | 否 | 无 | 通用字节来源。Bytes 直接复用；String 按 UTF-8；Array 元素必须是 0 到 255；`empty` 或 `null` 生成空 Bytes；其它值先转字符串再写入 UTF-8 字节。 |

## 返回值

| 类型 | 说明 |
|------|------|
| Bytes | 返回不可变字节值。 |

## 方法

| 方法 | 说明 |
|------|------|
| [len](/docs/bytes/len) | 返回字节长度。 |
| [get](/docs/bytes/get) | 读取指定下标字节。 |
| [slice](/docs/bytes/slice) | 截取字节区间。 |
| [to_array](/docs/bytes/to_array) | 转为整数数组。 |
| [to_hex](/docs/bytes/to_hex) | 转为十六进制文本。 |
| [to_base64](/docs/bytes/to_base64) | 转为 Base64 文本。 |
| [to_text](/docs/bytes/to_text) | 按 UTF-8 严格转文本。 |
| [append](/docs/bytes/append) | 追加数据并返回新 Bytes。 |

## 代码示例

```bt
data = bytes('4254', 'hex')

// 输出：BT
print data.to_text()
```

## 注意事项

- 单个 Bytes 缓冲受 `BT_BYTES_LIMIT` 限制，默认 16777216 字节，最大 67108864 字节。
- `to_text()` 遇到非法 UTF-8 返回 `null`，不会做 lossy 转换。
- Bytes 是不可变值，`append()`、`slice()` 都返回新的 Bytes。
