十六进制(Hexadecimal)编码广泛应用于哈希值展示、二进制协议调试和加密密钥表示。在 Zig 中,标准库提供了高效且零动态内存分配的 API。
核心功能:
std.fmt.bytesToHex(bytes, .lower | .upper):将字节切片直接编码为定长数组[bytes.len * 2]u8,可指定小写或大写格式,无需堆内存分配;std.fmt.hexToBytes(out_buf, hex_str):将十六进制字符串解码写入预先分配的缓冲区out_buf;- 错误处理:当输入包含非十六进制非法字符时返回
error.InvalidCharacter;若字符串长度为奇数则返回error.InvalidLength。
//! Demonstrate hexadecimal encoding and decoding in Zig.
const std = @import("std");
const print = std.debug.print;
pub fn main() !void {
const original_text = "Hello, Zig Hex Encoding!";
print("Original text: \"{s}\"\n", .{original_text});
// 1. Encode raw bytes into lowercase hexadecimal string.
// bytesToHex returns a fixed-size array [N * 2]u8, requiring no heap allocation.
const hex_lower = std.fmt.bytesToHex(original_text.*, .lower);
print("Hex (lowercase): {s}\n", .{hex_lower});
// 2. Encode raw bytes into uppercase hexadecimal string.
const hex_upper = std.fmt.bytesToHex(original_text.*, .upper);
print("Hex (uppercase): {s}\n", .{hex_upper});
// 3. Decode lowercase hex string back into original bytes.
var decoded_buf: [original_text.len]u8 = undefined;
const decoded_slice = try std.fmt.hexToBytes(&decoded_buf, &hex_lower);
print("Decoded text: \"{s}\"\n", .{decoded_slice});
try std.testing.expectEqualStrings(original_text, decoded_slice);
// 4. Decode uppercase hex string back into original bytes.
var decoded_buf2: [original_text.len]u8 = undefined;
const decoded_slice2 = try std.fmt.hexToBytes(&decoded_buf2, &hex_upper);
try std.testing.expectEqualStrings(original_text, decoded_slice2);
// 5. Handling invalid hex inputs:
var err_buf: [4]u8 = undefined;
// An invalid character returns error.InvalidCharacter
const invalid_char_result = std.fmt.hexToBytes(&err_buf, "123z");
try std.testing.expectError(error.InvalidCharacter, invalid_char_result);
// An odd-length input is rejected with error.InvalidLength
const invalid_len_result = std.fmt.hexToBytes(&err_buf, "123");
try std.testing.expectError(error.InvalidLength, invalid_len_result);
print("All hex encode and decode checks passed successfully!\n", .{});
}