首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何在C中定义24bit数据类型?

如何在C中定义24bit数据类型?
EN

Stack Overflow用户
提问于 2011-09-14 12:58:49
回答 5查看 33.9K关注 0票数 20

我将不得不在24位音频数据方面做很多工作。它只是无符号整数,而不是32位,而是24位。那么在C中定义和处理24位数据的更简单的方法是什么呢?

EN

回答 5

Stack Overflow用户

发布于 2011-09-14 13:10:33

根据需要,我可能会使用一个位字段:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
struct int24{
    unsigned int data : 24;
};

或者,如果分隔更容易,只需使用3个字节(unsigned char)。如果你不想填充结构,你可以强制它被打包。

编辑:我看到C++标签被删除了,但不管你是否更习惯使用C++,我还是把它留在这里,你可以使用如下内容:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const int INT24_MAX = 8388607;

class Int24
{
protected:
    unsigned char value[3];
public:
    Int24(){}

    Int24( const Int24& val )
    {
        *this   = val;
    }

    operator int() const
    {
        /* Sign extend negative quantities */
        if( value[2] & 0x80 ) {
            return (0xff << 24) | (value[2] << 16)
                                | (value[1] <<  8)
                                |  value[0];
        } else {
            return (value[2] << 16)
                 | (value[1] <<  8)
                 |  value[0];
        }
    }

    Int24& operator= (const Int24& input)
    {
        value[0]   = input.value[0];
        value[1]   = input.value[1];
        value[2]   = input.value[2];

        return *this;
    }

    Int24& operator= (const int input)
    {
        value[0]   = ((unsigned char*)&input)[0];
        value[1]   = ((unsigned char*)&input)[1];
        value[2]   = ((unsigned char*)&input)[2];

        return *this;
    }

    Int24 operator+ (const Int24& val) const
    {
        return Int24( (int)*this + (int)val );
    }

    Int24 operator- (const Int24& val) const
    {
        return Int24( (int)*this - (int)val );
    }

    Int24 operator* (const Int24& val) const
    {
        return Int24( (int)*this * (int)val );
    }

    Int24 operator/ (const Int24& val) const
    {
        return Int24( (int)*this / (int)val );
    }

    Int24& operator+= (const Int24& val)
    {
        *this   = *this + val;
        return *this;
    }

    Int24& operator-= (const Int24& val)
    {
        *this   = *this - val;
        return *this;
    }

    Int24& operator*= (const Int24& val)
    {
        *this   = *this * val;
        return *this;
    }

    Int24& operator/= (const Int24& val)
    {
        *this   = *this / val;
        return *this;
    }

    Int24 operator>> (const int val) const
    {
        return Int24( (int)*this >> val );
    }

    Int24 operator<< (const int val) const
    {
        return Int24( (int)*this << val );
    }

    operator bool() const
    {
        return (int)*this != 0;
    }

    bool operator! () const
    {
        return !((int)*this);
    }

    Int24 operator- ()
    {
        return Int24( -(int)*this );
    }

    bool operator== (const Int24& val) const
    {
        return (int)*this == (int)val;
    }

    bool operator!= (const Int24& val) const
    {
        return (int)*this != (int)val;
    }

    bool operator>= (const Int24& val) const
    {
        return (int)*this >= (int)val;
    }

    bool operator<= (const Int24& val) const
    {
        return (int)*this <= (int)val;
    }

    /* Define all operations you need below.. */
票数 17
EN

Stack Overflow用户

发布于 2011-09-14 13:08:27

干净和可移植的方式,假设你的样本是低字节顺序和未签名的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
static inline uint32_t getsample(uint8_t *buf, size_t pos)
{
    return buf[3*pos] + 256UL*buf[3*pos+1] + 65536UL*buf[3*pos+2];
}

static inline void putsample(uint8_t *buf, size_t pos, uint32_t sample)
{
    buf[3*pos]=sample;
    buf[3*pos+1]=sample/256;
    buf[3*pos+2]=sample/65536;
}

修复它使其适用于带符号的值,这需要更多的工作,特别是如果你想让它保持可移植性的话。请注意,如果在处理之前将整个样本窗口转换为更健全的格式,然后在处理完成后再转换回来,性能可能会更好。

票数 5
EN

Stack Overflow用户

发布于 2011-09-14 13:09:02

使用足以容纳24位数据的数据类型。它们都是在stdint.h中定义的int32_tuint32_t

你正在处理音频数据,所以你想要加法工作(你需要它来混合)。此外,有一些额外的8位也不是一件坏事,因为它为你提供了大约24dB的额外动态范围,你需要混合几个充分利用24位动态范围的信号源。

请注意,您刚才询问的是用于24位样本的数据类型。如果你打算读取一个整齐打包的24位样本帧流,你必须将其拆分。首先,您必须知道流是高字节优先的还是低字节优先的。然后,您可以使用类似以下内容将流重新排列为样本:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
uint32_t bitstream_BE_to_sample(uint8_t bits[3])
{
    return (bits[0] << 16) | (bits[1] << 8) | (bits[2]);
}

uint32_t bitstream_LE_to_sample(uint8_t bits[3])
{
    return (bits[2] << 16) | (bits[1] << 8) | (bits[0]);
}

uint8_t *bitstream;
uint32_t *samples;
for(;;) {
    *samples = bitstream_XX_to_sample(bitstream);
    samples++;
    bistream += 3;

    if(end_of_bitstream())
         break;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7416699

复制
相关文章
如何在C中定义多行宏定义?
请参阅下面的示例,其中我将交换两个变量的值。 do-while(0)结构很不错 #include <stdio.h> #define swap(x,y,T) do { \ T temp = (*x);\ (*x) = (*y); \ (*y) = temp; \ } while (0) int main(void) { int a = 5; int b = 9; printf("Value of a and b before swaping\n"
用户4645519
2020/09/08
2.6K0
如何在C中定义多行宏定义?
C语言数据类型的定义
将各个位数的二进制用十进制中的【数字 】来表示多位的二进制数 通过【数字 】相加就可以得到二进制数的数据
以某
2023/03/07
1.3K0
C语言自定义数据类型
结构体 参考视频:https://www.bilibili.com/video/BV1oi4y1g7CF?p=58 大纲: 结构体的声明 结构体的自引用 结构体内存对齐 结构体传参
半生瓜的blog
2023/05/12
4140
如何在python中定义有序字典
0x00 前言 最近遇到一个大坑,在测一个程序的时候。程序接受的数据是json,但是要求json是有序的(吐槽一样,要求有序的用json干屁啊!) 当我用python构造字典的时候,总会给我排序,用json.dumps转化为json后。导致程序解析失败。所以,在此研究了一下如何构造有序的json。 0x01 解决 网上查了一下,用到了python中有序字典OrderdDict,在collections库中。 在默认情况下: >>> d= {} >>> d["2"]=2 >>> d["1"]=1 >>> d[
WeaponX
2018/07/11
1.7K0
如何在Vue组件中定义方法
在上述示例中,使用 methods 选项来定义了两个方法:methodName 和 anotherMethod。你可以根据需要添加任意数量的方法。
王小婷
2023/09/13
5280
C语言进阶(十一) - 自定义数据类型
C语言中本身包含了许多数据类型,但并不能够总是满足需要。自定义类型允许使用者创造出特定的且适合需要的类型。本文主要介绍结构体、位段、枚举与联合。
怠惰的未禾
2023/04/27
4740
C语言进阶(十一) - 自定义数据类型
如何在python中引入高性能数据类型?
python 最大的优点之一是它可以广泛地选择模块和包。它们将 python 的功能扩展到许多流行的领域,包括机器学习、数据科学、web 开发、前端等等。其中最好的一个优点是 python 的内置 collections 模块。
AI研习社
2019/10/24
1.4K0
如何在python中引入高性能数据类型?
C语言 u16_c语言自定义数据类型
typedef signed char int8_t;
全栈程序员站长
2022/11/04
1.2K0
C语言 u16_c语言自定义数据类型
【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
文章目录 引用类型 引用类型 引用数据类型 : 1. 引用数据类型定义 : 类型名称& 变量名 = 对应类型变量名称 ; //① 定义 普通 类型 变量 int a = 8; //② 定义 引用类型变量, 格式 : 类型名称& 变量名 = 对应类型变量名称 ; int& b = a; 2. 上述引用数据类型解析 : int& 是引用数据类型 , b 是 a 的引用 ; ① 变量定义本质 : int a = 8; 分配一块内存存放 int 类型数据 8 , 将该内存赋予一个别名 a ; ②
韩曙亮
2023/03/27
7200
【C++ 语言】引用数据类型 ( 引用数据类型定义 | 引用数据类型使用 | 引用类型参数 )
如何在CSS中自定义鼠标样式
想着美化下自己的个人部落格,那就先从鼠标样式开始美化吧,默认的鼠标样式有点单调,那应该如何美化呢?
用户1094633
2022/02/14
2.3K0
c语言之指针数据类型的不同定义含义
定义 含义 int i; 定义整型变量i int* p; p为指向整型数据的指针变量 int a[n]; 定义整型数组a,它有n个元素 int* p[n]; 定义指针数组p,它由n个指向整型数据的指针元素构成 int (*p)[n]; p为指向含n个元素的一维数组的指针变量 int f(); f为返回整型值的函数 int* p(); p为返回一个指针的函数,该指针指向整型数据 int (*p)(); p为函数指针。该函数返回一个整型值 int **P; p是一个指针变量,它指向一个指向整型数据的指针变量
西西嘛呦
2020/08/26
8290
变量以及数据类型_数据类型定义
变量相当于内存中一个数据存储空间的表示,你可以把变量看做是一个房间的门牌号,通过门牌号我们可以找到房间,而通过变量名可以访问到变量(值)
全栈程序员站长
2022/11/01
1K0
变量以及数据类型_数据类型定义
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
29K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
Ryu:如何在LLDP中添加自定义LLDPDU
在许多实验场景中,都需要使用链路发现协议(LLDP)来发现链路,从而构建网络拓扑。然而LLDP协议不仅仅可以用来发现拓扑,也可以用于时延检测等业务。LLDP通过添加对应的TLV格式的LLDPDU(LL
SDNLAB
2018/04/02
2.7K0
Ryu:如何在LLDP中添加自定义LLDPDU
C中的预编译宏定义
文章来自 http://www.uml.org.cn/c++/200902104.asp 在将一个C源程序转换为可执行程序的过程中, 编译预处理是最初的步骤. 这一步骤是由预处理器(preprocessor)来完成的. 在源流程序被编译器处理之前, 预处理器首先对源程序中的"宏(macro)"进行处理. C初学者可能对预处理器没什么概念, 这是情有可原的: 一般的C编译器都将预处理, 汇编, 编译, 连接过程集成到一起了. 编译预处理往往在后台运行. 在
杨奉武
2018/04/18
2.9K0
如何在mybatis xml文件中定义局部变量?
mybatis定义全局变量只需要配置一下即可,那如何在mybatis xml文件中定义局部变量呢?这就需要使用<bind>标签了。
索码理
2022/12/28
3.3K0
如何在 JavaScript 中创建自定义排序方法
一般情况咱们排序大都按数字或字母顺序,但也有一些情况下,咱们可能需要自定义排序顺序。
前端小智@大迁世界
2020/05/12
3.3K0
如何在 JavaScript 中创建自定义排序方法
如何在 Swift 中自定义操作符
很少有Swift功能能和使用自定义操作符的一样产生如此多的激烈辩论。虽然有些人发现它们真的有用,可以降低代码冗余,或实施轻量级语法扩展,但其他人认为应该完全避免它们。
Swift社区
2021/11/26
1.2K0
如何在Keras中创建自定义损失函数?
我们使用损失函数来计算一个给定的算法与它所训练的数据的匹配程度。损失计算是基于预测值和实际值之间的差异来做的。如果预测值与实际值相差甚远,损失函数将得到一个非常大的数值。
AI研习社
2019/12/03
4.5K0
点击加载更多

相似问题

如何在C++中“定义”数据类型?

38

如何在C#中全局定义常量(如DEBUG)

418

如何在cpp结构中添加用户定义的数据类型(如日期/时间)?

12

如何在汇编中实现数据类型,如堆栈?

21

数据类型的c#未定义的对象数量(如params[])

13
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文