【问题标题】:Map 10Bit buffer to 8Bit将 10Bit 缓冲区映射到 8Bit
【发布时间】:2016-08-01 20:38:58
【问题描述】:

我有一个 10 位 SDI 流,当我收到它时,它将被存储到 uint8_t *buffer 中,当我阅读它时,我得到的值与预期完全不同,除了第一个:

10Bit -> 00 0000 0001 | 00 0101 1010 → 十六进制:A5 10

8 位 -> 0000 | 0000 0100 | 0101 1010 → 十六进制:A5 40

有没有我可以用来正确映射它的函数? (C++风格)

如果不存在,如何实现?

【问题讨论】:

  • 10位值是001 05A,8位值是0 04 5AA5 10A5 80怎么得到?
  • 有没有可以用来正确映射的函数? (C++ 风格) 我不知道。你可能不得不自己写一个。这个问题类似:stackoverflow.com/questions/11680248/…
  • 是的对不起,我从右到左读它,因为来自流的第一个值是正确的,当然 8Bit 值将是 4 而不是 8,我会更正它,但是问题并没有改变,即使相反,我也读取了错误的值,是否有转换它的函数?
  • 您在问:我有这 3 种颜色,如何将它们映射到这 2 种其他颜色。那么你不能不丢失一些信息。如果您可以保证不会出现一种颜色(使用了高 2 位),那么您可以将它们剪掉。或者你可以将你从 10 位中得到的数字除以 / 4,你可以在损失一些精度的情况下映射它们。
  • 您的意思是 a) 您想从每个元素中丢弃 2 位并将其存储为 8 位?或者你的意思是 b) 你想将 10 位存储在一个 16 位数组中,这样当你访问第一个数组元素时,你会从原始流中获得第一个 10 位值,而当你访问第二个数组元素时,你会得到原始流中的第二个 10 位值? a) 涉及精度/分辨率的损失,b) 涉及填充/位旋转。

标签: c++ uint8t


【解决方案1】:

基本上,您需要使用 fread() 和正确的参数来将 5 个字节(即 40 位)准确地读取到临时缓冲区中。您使用该数量是因为它对应于输入流上的整数字节数以及输出流上的整数输出字节数。

然后您使用左右 SHIFT(<<>>)和位掩码(&)提取 5 个输出字节并将它们放入您的 uint8_t 缓冲区。

【讨论】:

    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    相关资源
    最近更新 更多