【问题标题】:convert 512-bits in a 256 Hexadecimal table在 256 十六进制表中转换 512 位
【发布时间】:2016-01-28 09:52:04
【问题描述】:

我有一个缓冲区 unsigned char table[512],我想将它更快地转换成一个 short int table[256] 表格,其中每个位置都由表格的字节组成。

我有一个相机,它给了我这个缓冲区,它是将视差转换为真实深度的表格。

unsigned char zDtable[512] = {0};
unsigned short int zDTableHexa[256]={0};
.. get the buffer data.....
for (int i = 0; i < 256; ++i) {
        zDTableHexa[i]=zDtable[i*2]<<8 + zDtable[i*2+1];

}

这两个在转换值方面存在问题,字节反转:

memcpy(zDTableHexa_ptr,zDtable,256*sizeof( unsigned short int));
unsigned short* zDTableHexa = (unsigned short*)zDtable;

【问题讨论】:

  • 数据以二进制的形式存储在内存中。十进制、十六进制和八进制只是将二进制数据表示为数字的不同方式。
  • 至于“FAST”,您是否进行了测量和分析以了解这是一个瓶颈?像这样的小循环在几乎所有现代硬件上都会非常快,您需要一个非常小的嵌入式系统才能进行测量。

标签: c++ arrays buffer


【解决方案1】:

试试这样的

short* zDTableHexa = (short*)zDtable;

它只是将 char 数组的内存空间映射到一个 short 数组。所以如果内存看起来像这样: (char0),(char1),(char2),(char3)

那么它将被重新解释为
(short0 = char0,char1),(short1 = char2,char3)

请注意,这种直接的重新解释取决于字节序,并且正式允许足够迂腐的编译器做不好的事情,即它是系统和编译器特定的。

【讨论】:

  • 这也取决于字节序,但它使用的处理时间远少于通过 for 循环运行
  • 您可能需要添加解释。仅一行代码并不值钱。此外,如果 zDtable 未对齐,您的线路可能无法正常工作。
  • a) 此代码无法编译,因为您将数组视为指针。 b) 它违反了严格的别名,因此是 UB,即使架构对齐是可以的。
  • 首先,数组是一个指针。它是如何导致混叠的?
  • @BrandonPiner 不,不是,它只是经常衰减。试试看,或阅读标准(或这里的一些问题或......)。您现在更改的代码也不会编译,它比以前更错误。 ...关于严格的混叠,我没有说它“导致混叠”,不管那是什么意思。如果您不知道什么是严格别名,请也阅读一下。在这里评论太多了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-04
相关资源
最近更新 更多