【问题标题】:How do you read in a 3 byte size value as an integer in c++?您如何在 c++ 中将 3 字节大小的值作为整数读取?
【发布时间】:2012-04-11 09:36:52
【问题描述】:

我正在读取一个 id3 标记,其中每个帧的大小以 3 个字节指定。我如何能够将此值用作 int?

【问题讨论】:

  • “阅读”是什么意思?从记忆里?来自文件?
  • 在 C 中,您可以使用称为位字段的东西,类型为 int,占用 3 个字节 = 3*8=24 位。在 C 中,这由 int int_3byte : 24 表示(在结构内)。我想 C++ 对此有一个等效的机制。
  • @CarlNorum 为什么不呢?假设我需要一个 100 元素的 3 字节值数组——使用位字段会更容易,不是吗?
  • @Alex,我不知道你会怎么做;位域只能声明为结构的一部分,不能单独声明。你打算如何设置这个数组?

标签: c++ int byte id3


【解决方案1】:

读取每个字节,然后将它们一起放入您的int

int id3 = byte0 + (byte1 << 8) + (byte2 << 16);

请务必考虑字节序。

【讨论】:

  • 没关系,在这种情况下它们是一样的。
  • 还要确保byte0byte1byte2 具有unsigned char 类型(或具有0..255 范围内的值)
【解决方案2】:

单独读取字节,并将它们放入 int 中的正确位置:

int value = 0;

unsigned char byte1 = fgetc(ID3file);
unsigned char byte2 = fgetc(ID3file);
unsigned char byte3 = fgetc(ID3file);

value = (byte1 << 16) | (byte2 << 8) | byte3;

编辑:ID3 似乎使用网络(大端)字节顺序——更改了代码以匹配。

【讨论】:

  • 这假定char 是无符号的...(另外,fgetc 返回一个int!)
  • @OliCharlesworth:fgetc 返回一个 int,但唯一可以为负的值(作为一个 int)是 EOF(我暂时忽略)之类的值。
  • C++ 人可能完全讨厌使用fgetc(),但我支持 Jerry。
【解决方案3】:

如果你的过程是计算密集型的,并且你想节省时间(尤其是如果你在做嵌入式系统),我的建议是使用 union/struct。这样就减轻了左移和右移的负担。

union{
unsigned int ui32;
struct{
    unsigned char ll;
    unsigned char lh;
    unsigned char hl;
    unsigned char hh;
    }splitter;
}combine;

combine.splitter.ll = 0x78;
combine.splitter.lh = 0x56;
combine.splitter.hl = 0x34;
combine.splitter.hh = 0x12;

printf("This is the combined Value: %d", combine.ui32);

这应该可以。如果有人觉得不应该使用这个,请告诉我原因。

干杯! 阿迪亚

【讨论】:

  • 除了不是3 Bytes,非常有用!
  • @JackAvante..好吧,如果您不想要第四个字节,请最初将其设置为 0,并且不要在您的进程中更新 combine.splitter.hh 变量。
  • 因为有更好的方法。结构不是必需的。问题是,它不是 3 字节转换解决方案。模板 union Buffer { unsigned char arr[sizeof(T)]; T 变量; };
猜你喜欢
  • 2012-03-21
  • 1970-01-01
  • 2010-10-07
  • 2019-03-23
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2018-03-14
  • 1970-01-01
相关资源
最近更新 更多