当前位置: 首页 > article >正文

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅囱

从0构建WAV文件读懂计算机文件的本质虽然接触计算机有一段时间了但是我的视野一直局限于一个较小的范围之内往往只能看到于算法竞赛相关的内容计算机各种文件在我看来十分复杂认为构建他们并能达到目的是一件困难的事情然而近期我观看了油管上Magicalbat大神的视频发现其实它们的本质都惊人地简单所有计算机文件都是按特定规则组织的二进制数据是人为规定好格式再由计算机解析对于我们来说只要根据规定格式进行编辑就能够成功构建。今天我们就从最朴素的方式入手通过手动构建一个WAV音频文件拆解WAV格式的底层逻辑同时理解一个核心认知只要掌握了文件的格式规范任何类型的文件都能像搭积木一样一行行代码“拼”出来。先认识WAVWAV文件的格式WAV是微软开发的无损音频格式相比于压缩后的MP3它的结构更直白没有复杂的编码压缩因此我们能够通过C文件写入的方式直接完成wav文件的构建wav文件的核心由三个关键的“数据块(Chunk)”组成RIFF块文件的“身份卡”告诉计算机“我是一个WAV文件”fmt块音频的“参数说明”记录采样率、声道数、位深等核心参数data块真正的音频数据存储着声音的数字信号。而每个块的内容又如下图所示RIFF:字段名 字节数 数据类型 固定值/计算规则ChunkID 4 ASCII字符 固定为RIFF无终止符严格4字节ChunkSize 4 32位无符号整数 取值 整个WAV文件大小 - 8字节减去ChunkID和ChunkSize自身的8字节Format 4 ASCII字符 固定为WAVE无终止符严格4字节fmt:字段名 字节数 数据类型 固定值/计算规则ChunkID 4 ASCII字符 固定为fmt 末尾空格无终止符ChunkSize 4 32位无符号整数 PCM编码最常用下固定为16代表后续字段的总字节数不含ChunkID和ChunkSizeAudioFormat代码中Tag 2 16位无符号整数 编码格式1PCM无压缩通用3IEEE浮点6μ律7A律等NumChannels代码中Chnnels拼写笔误 2 16位无符号整数 声道数1单声道2立体声2多声道SampleRate 4 32位无符号整数 采样率每秒采样次数常见44100HzCD音质、48000Hz、22050Hz等ByteRate 4 32位无符号整数 每秒音频数据字节数 SampleRate × NumChannels × BitsPerSample / 8BlockAlign代码中BloclAlign拼写笔误 2 16位无符号整数 每个“采样帧”的字节数 NumChannels × BitsPerSample / 8播放器一次读取的最小单位BitsPerSample代码中BitsperSample 2 16位无符号整数 采样位深每个采样点的比特数8/16/24/3216位最常用data:字段名 字节数 数据类型 固定值/计算规则ChunkID代码中DataId 4 ASCII字符 固定为data无终止符严格4字节DataSize 4 32位无符号整数 音频数据总字节数 采样总数 × BlockAlign采样总数 SampleRate × 音频时长音频数据区 可变 二进制流 PCM编码下为线性整数/浮点数16位位深对应int16_t8位对应uint8_t32位浮点对应float我们接下来的代码就是严格按照这个模板把每个部分的二进制数据“写”进文件里。从零构建WAV一行代码拆解核心逻辑下面是完整的C代码新手也能看懂我们逐段拆解看如何从0生成一个能播放的440Hz正弦波WAV文件#includeusing namespace std;// 类型别名让代码更易读明确数据的字节长度#define u32 uint32_t // 32位无符号整数4字节#define u16 uint16_t // 16位无符号整数2字节#define f32 float // 32位浮点数4字节#define i16 int16_t // 16位有符号整数2字节#define HZ 44100 // 采样率每秒采集44100个声音样本标准音频采样率#define DURATION 5 // 音频时长5秒// 1. 定义WAV的三个核心数据块结构对应格式规范// RIFF块文件整体标识struct chunk1{char ChunkID[4]; // 块标识固定为RIFFu32 ChunkSize; // 从该字段到文件末尾的字节数总字节数-8char Format[4]; // 格式类型固定为WAVE}RIFF;// fmt块音频参数配置struct chunk2{char ChunkID[4]; // 块标识固定为fmt 注意末尾有空格u16 Tag; // 编码格式1代表PCM无压缩u32 ChunkSize; // fmt块的大小PCM格式固定为16u16 Chnnels; // 声道数1单声道2立体声u32 SampleRate; // 采样率u32 ByteRate; // 每秒数据量 采样率×声道数×位深/8u16 BloclAlign; // 每个采样的总字节数 声道数×位深/8u16 BitsperSample; // 每个采样的位深16位常见}Fmt;// data块音频数据存储区struct chunk3{char DataId[4]; // 块标识固定为datau32 DataSize; // 音频数据的总字节数}Data;signed main(int argc,char* argv[]){// 打开文件wb表示以二进制模式写入关键文件本质是二进制FILE *fp fopen(test.wav,wb);// 计算总采样数采样率×时长5秒×44100220500个样本u32 NumSamples HZ * DURATION;// 2. 填充RIFF块并写入文件memcpy(RIFF.ChunkID,RIFF,4); // 写入块标识RIFF.ChunkSize NumSamples*sizeof(u16)36; // 计算块大小memcpy(RIFF.Format,WAVE,4); // 声明为WAVE格式fwrite(RIFF.ChunkID,sizeof(char),4,fp); // 写入4个字符的ChunkIDfwrite(RIFF.ChunkSize,sizeof(u32),1,fp); // 写入4字节的ChunkSizefwrite(RIFF.Format,sizeof(char),4,fp); // 写入4个字符的Format// 3. 填充fmt块并写入文件memcpy(Fmt.ChunkID,fmt ,4);Fmt.ChunkSize 16; // PCM格式下fmt块固定16字节Fmt.Tag 1; // PCM无压缩编码Fmt.Chnnels 1; // 单声道Fmt.SampleRate HZ; // 44100Hz采样率Fmt.ByteRate HZ*sizeof(u16); // 每秒字节数44100×288200Fmt.BloclAlign Fmt.Chnnels * sizeof(u16); // 每个采样2字节Fmt.BitsperSample 16; // 16位位深// 按顺序写入fmt块的所有参数严格遵循格式规范fwrite(Fmt.ChunkID,sizeof(char),4,fp);fwrite(Fmt.ChunkSize,sizeof(u32),1,fp);fwrite(Fmt.Tag,sizeof(u16),1,fp);fwrite(Fmt.Chnnels,sizeof(u16),1,fp);fwrite(Fmt.SampleRate,sizeof(u32),1,fp);fwrite(Fmt.ByteRate,sizeof(u32),1,fp);fwrite(Fmt.BloclAlign,sizeof(u16),1,fp);fwrite(Fmt.BitsperSample,sizeof(u16),1,fp);// 4. 填充data块并写入文件memcpy(Data.DataId,data,4);Data.DataSize NumSamples * sizeof(u16); // 音频数据总字节数fwrite(Data.DataId,sizeof(char),4,fp);fwrite(Data.DataSize,sizeof(u32),1,fp);// 5. 生成音频数据并写入440Hz正弦波标准A调for(int i0;if32 t (f32)i/HZ; // 计算当前时间点秒// 生成440Hz正弦波的数值声音的本质是振动正弦波模拟声波f32 y sinf(t*440.0f*2.0f*3.1415926f);// 转换为16位整数适配16位位深的音频i16 sample (i16)(y*INT16_MAX);// 写入单个音频样本2字节fwrite(sample,sizeof(i16),1,fp);}fclose(fp); // 关闭文件return 0;}所有文件都是“按规则写二进制”的产物写完这段代码你可能会发现生成WAV文件的过程就是“按格式规范往文件里写二进制数据”的过程。而这个逻辑适用于所有计算机文件TXT文档本质是字符的ASCII/UTF-8编码比如字符A对应二进制01000001我们按顺序写入这些编码就成了TXT文件BMP图片由文件头记录宽、高、位深 像素数据每个像素的RGB值组成按BMP格式写这些数据就能生成图片MP4视频哪怕是压缩过的视频也是按MP4的格式规范把编码后的视频帧、音频帧组织成二进制数据EXE可执行文件遵循PE格式把指令、数据、资源按规则写入操作系统就能识别并运行。计算机之所以能“看懂”不同的文件不是因为文件有“魔法”而是因为程序员提前约定了“格式规范”——就像我们约定“RIFF”开头的是WAV文件播放器读到这个标识就按WAV的规则解析后续数据。计算机的本质是“朴素的规则”对刚接触计算机的人来说各种文件、软件、系统看似复杂但拆解到最底层都是“数据规则”的组合只要我们对着格式手册即便使用最朴素的方式也能够成功构建出可以使用的音频文件。计算机的世界没有想象中那般复杂计算机只在乎那最终排好队的 0 和 1。进一步思考从文件到软件了解了各类文件本质我们自然能理解计算机中各个编辑软件的原理是什么了就比如今天举的wav的例子如果我们将示例程序改进一下加入输入那么这是否就成了一个简单的音频编辑软件了呢所有的复杂软件如 Photoshop、Premiere底层逻辑都是如此读取特定规则的二进制 - 在内存中加工处理 - 按规则写回二进制。当你不再把文件看作“黑盒”你便拥有了重塑数字世界的能力。准陶庇挝

相关文章:

别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅囱

从0构建WAV文件:读懂计算机文件的本质 虽然接触计算机有一段时间了,但是我的视野一直局限于一个较小的范围之内,往往只能看到于算法竞赛相关的内容,计算机各种文件在我看来十分复杂,认为构建他们并能达到目的是一件困难…...

EF Core 原生 SQL 实战:FromSql、SqlQuery 与对象映射边界味

先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...

【 LangChain v1.2 入门系列教程】【三】工具(Tools)开发,让 Agent 连接外部世界

系列文章目录 【 LangChain v1.2 入门系列教程】【一】开篇入门 | 从零开始,跑通你的第一个 AI Agent 【 LangChain v1.2 入门系列教程】【二】消息类型与提示词工程 【 LangChain v1.2 入门系列教程】【三】工具(Tools)开发,让…...

硅谷新宠Hermes Agent,能否逆袭OpenClaw?

硅谷新宠Hermes Agent一夜爆火,GitHub揽6.6万星,原生接入微信引开发者关注。它在OpenRouter表现出色,还发布首篇“顶会级”论文,提出新推理方法。 爆火的Hermes Agent Hermes Agent历经9个月打磨,在GitHub狂揽66k星、F…...

Chrome文本替换插件终极指南:如何智能编辑任何网页内容

Chrome文本替换插件终极指南:如何智能编辑任何网页内容 【免费下载链接】chrome-extensions-searchReplace 项目地址: https://gitcode.com/gh_mirrors/ch/chrome-extensions-searchReplace 在浏览网页时,你是否曾遇到过需要修改页面内容却无能为…...

忙得上天入地的导师派师姐助我毕设之救我狗命笔记(一)

开源模型探索实践-环境配置与参数修改一、环境配置按照 README 说明进行基础配置。在终端中依次执行以下命令:bashconda create -n aqatrack python3.8 conda activate aqatrack bash install.sh⚠️ 注意:Windows 系统执行最后一行会报错,此…...

Blender 3MF插件:从建模到3D打印的终极桥梁

Blender 3MF插件:从建模到3D打印的终极桥梁 【免费下载链接】Blender3mfFormat Blender add-on to import/export 3MF files 项目地址: https://gitcode.com/gh_mirrors/bl/Blender3mfFormat 在3D打印技术日益普及的今天,你是否曾为文件格式转换的…...

Retinaface+CurricularFace镜像作品集:高清人脸比对效果展示

RetinafaceCurricularFace镜像作品集:高清人脸比对效果展示 你是否好奇,一个开箱即用的人脸识别镜像,究竟能做出多惊艳的效果?今天,我们不谈复杂的配置,也不讲枯燥的原理,直接带你看看这个Reti…...

FreeRTOS时间管理实战:如何用vTaskDelay和vTaskDelayUntil实现精准任务调度

FreeRTOS时间管理实战:精准任务调度的艺术与科学 1. 嵌入式实时系统中的时间管理基础 在嵌入式实时操作系统中,时间管理如同交响乐团的指挥,协调着各个任务的执行节奏。FreeRTOS作为轻量级RTOS的代表,其时间管理机制直接影响着系统…...

406记录

栈(Stack)是限定仅在表尾进行插入或删除操作的线性表。因此,对栈来说,表尾端有其特殊含义,称为栈顶(top),相应地,表头端称为栈底(bottom)。不含元…...

Java的java.util.HexFormat自定义格式

Java的HexFormat:十六进制处理的现代方案 在数据处理、网络通信或安全加密领域,十六进制格式的转换与解析是常见需求。Java 17引入的java.util.HexFormat类,为开发者提供了标准化且灵活的十六进制处理工具,告别了以往依赖手动拼接…...

LeetCode hot 100 (12-16,自用2026.04.06)

LeetCode hot 100 (12-16,自用2026.04.06) 53. 最大子数组和 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 子数组是数组中的一个连续部分。 示例 1: 输入…...

Qwen3.5-9B-AWQ-4bit图文理解参数详解:temperature=0.7时的稳定性与丰富度平衡

Qwen3.5-9B-AWQ-4bit图文理解参数详解:temperature0.7时的稳定性与丰富度平衡 1. 模型概述 Qwen3.5-9B-AWQ-4bit是一个支持图像理解的多模态模型,能够结合上传图片与文字提示词,输出中文分析结果。这个量化版本特别适合处理以下任务&#x…...

YOLO12工业场景迁移指南:从COCO预训练到产线缺陷检测的微调路径

YOLO12工业场景迁移指南:从COCO预训练到产线缺陷检测的微调路径 1. 引言:当通用模型遇上工业难题 想象一下,你拿到一个在通用场景下表现优异的“全能选手”——YOLO12,它能轻松识别照片里的人、车、猫、狗。现在,你需…...

01-秒杀系统设计详解

秒杀系统设计详解 一、知识概述 秒杀系统是电商领域最具挑战性的高并发场景之一,典型特征是瞬时高并发、库存有限、时间敏感。一个成功的秒杀系统需要在极短时间内处理海量请求,同时保证数据一致性和用户体验。 核心挑战: 流量突增:平时QPS可能只有几十,秒杀开始瞬间可…...

MiniCPM-V-2_6部署不求人:Ollama三步走,小白也能轻松玩转

MiniCPM-V-2_6部署不求人:Ollama三步走,小白也能轻松玩转 1. 为什么选择MiniCPM-V-2_6? MiniCPM-V-2_6是目前视觉多模态领域的一颗新星,它虽然体积小巧(仅8B参数),但性能却能与GPT-4V、Gemini…...

AudioSeal Pixel Studio快速上手:移动端Safari/Chrome对Streamlit音频组件兼容性

AudioSeal Pixel Studio快速上手:移动端Safari/Chrome对Streamlit音频组件兼容性 1. 工具简介与核心价值 AudioSeal Pixel Studio是一款基于Meta开源的AudioSeal算法构建的专业音频水印工具。它能够在保持原始音质几乎不变的情况下,为音频文件嵌入隐形…...

Python 多线程爬虫性能调优方案

Python多线程爬虫性能调优方案 在当今大数据时代,网络爬虫已成为数据采集的重要工具。面对海量数据和高频请求,单线程爬虫往往效率低下,难以满足需求。Python多线程爬虫因其并发特性,能够显著提升爬取效率,但若未合理…...

Phi-4-mini-reasoning多场景落地:教育科技公司AI助教产品核心推理模块

Phi-4-mini-reasoning多场景落地:教育科技公司AI助教产品核心推理模块 1. 模型介绍与定位 Phi-4-mini-reasoning是一款专注于推理任务的文本生成模型,特别适合数学题解答、逻辑推理、多步分析和简洁结论输出等场景。与通用聊天模型不同,它被…...

从人工到智能:Ostrakon-VL-8B助力中小餐饮企业巡检效率提升80%

从人工到智能:Ostrakon-VL-8B助力中小餐饮企业巡检效率提升80% 1. 引言:餐饮老板的日常烦恼与AI解法 开过餐馆的朋友都懂,每天一睁眼就是各种操心。后厨的卫生达标了吗?食材新鲜度够不够?员工操作规范吗?…...

层次化文本分类:利用文档结构与类别树提升分类性能

点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 1. 引言:当分类问题有了“上下级” 传统的…...

MiniCPM-o-4.5-nvidia-FlagOS本地化部署:Ollama模式与星图GPU方案对比

MiniCPM-o-4.5-nvidia-FlagOS本地化部署:Ollama模式与星图GPU方案对比 最近在折腾MiniCPM-o-4.5-nvidia-FlagOS这个模型,发现不少朋友在部署时有点纠结。有人想在自己笔记本上快速跑起来试试,也有人希望找个稳定、性能好的地方长期用。我花时…...

Python的__enter__方法返回非自身对象与资源管理代理模式的设计

Python的上下文管理器通过__enter__和__exit__方法实现了资源的自动管理,但鲜为人知的是,__enter__方法可以返回非自身对象,这一特性为资源管理代理模式的设计提供了更多可能性。这种设计模式不仅简化了代码结构,还增强了灵活性和…...

Redis 菜鸟学习

目录 第1章 Redis入门——五个核心的数据结构 Redis 简介 1. Redis 是什么? 2. Redis 的典型应用场景(它用来干嘛?) 3. 开启命令面板、退出、中文显示 4. 侦探三件套 字符串(String)—— 最基础的存…...

**RISC-V生态下的轻量级RTOS移植实战:从零开始构建嵌入式系统核心**在当前国产化

RISC-V生态下的轻量级RTOS移植实战:从零开始构建嵌入式系统核心 在当前国产化替代浪潮中,RISC-V架构凭借其开源、灵活、可定制等优势迅速崛起,成为嵌入式开发领域的热点方向。本文将深入探讨如何在RISC-V平台上移植一个轻量级实时操作系统&am…...

别再死记硬背ESP32 BLE API了!用这个“事件驱动”思维导图,5分钟理清GAP/GATT回调逻辑

用事件驱动思维重构ESP32 BLE开发:从API记忆到逻辑推演的艺术 在物联网设备开发中,BLE(低功耗蓝牙)技术因其低功耗特性成为连接智能设备的首选方案。ESP32作为集成BLE功能的明星芯片,其开发门槛却让不少工程师望而生畏…...

Rust的匹配中的使用规范

Rust的匹配机制是其语言设计中极具特色的一部分,它不仅提供了强大的模式匹配能力,还能在编译时确保代码的完备性和安全性。匹配(match)是Rust中处理多分支逻辑的核心工具,广泛应用于枚举解构、错误处理、条件分支等场景…...

ACE-Step音乐模型部署体验:一键生成高质量音频,创作效率大提升

ACE-Step音乐模型部署体验:一键生成高质量音频,创作效率大提升 1. 音乐创作的新时代 你是否曾经遇到过这样的困境:脑海中有一段美妙的旋律,却苦于不会乐器或不懂乐理,无法将它变成现实?或者作为一名内容创…...

SDPose-Wholebody在Linux系统下的高效部署方案

SDPose-Wholebody在Linux系统下的高效部署方案 1. 引言 想试试那个能精准识别人体133个关键点的SDPose-Wholebody模型吗?作为基于Stable Diffusion的新一代姿态估计方案,它在处理复杂场景和跨域数据时表现相当出色。不过很多朋友在Linux系统上部署时遇…...

Vue实战:打造智能视频播放器——倍速控制、音量调节、进度拖拽与AI字幕生成

1. 从零开始构建Vue智能视频播放器 最近在做一个在线教育项目时,我发现现有的视频播放器功能太过基础,无法满足用户对学习效率的需求。于是决定用Vue自己开发一个带倍速控制、音量调节、进度拖拽和AI字幕的智能播放器。经过两周的实战,我把踩…...