【问题标题】:How to extract 2 bytes from a word, and how to make a word from 2 bytes (in C)?如何从一个单词中提取 2 个字节,以及如何从 2 个字节中生成一个单词(在 C 中)?
【发布时间】:2013-02-21 01:10:35
【问题描述】:

我试图从一个 16 位字中提取两个字节,并从两个字节中生成一个 16 位字。这是我尝试过的(byte = unsigned char, word = unsigned short):

将 grpix 字拆分为 2 个字节:

word grpix; // Assume that the value has been initialized

byte grpixl = grpix & 0x00FF;
byte grpixh = grpix & 0xFF00;

用 2 个字节制作 grpix 字

byte grpixh; // Assume that the value has been initialized
byte grpixl; // Assume that the value has been initialized

word grpix = grpixh;
grpix <<= 8;
grpix += grpixl;

由于某种原因,我的代码没有按预期工作,现在我不确定单词的“拆分”是否错误,单词的“制作”是否错误,或两者兼而有之......你能给我一些建议吗?

【问题讨论】:

  • 你确定你在一个大端机器上吗?英特尔芯片是小端的。
  • 大端还是小端?
  • 嗯,我的笔记本有英特尔芯片。
  • 这个 StackOverflow 条目也可能有帮助:stackoverflow.com/questions/14950366/…

标签: c byte word


【解决方案1】:

拆分单词时,您并没有移动。所以如果grpix0x1234,那么grpixl 得到预期的0x34grpixh 最终是0x1200。你应该说

byte grpixh = grpix >> 8;

当然,您也忽略了可能存在的任何字节顺序问题。在尝试拆分之前,您可能应该将您的单词转换为已知的字节序(使用 htons() 之类的东西)(并在加入时进行反向转换)。

【讨论】:

  • 我将我的代码更改为:byte grpixh = (grpix &gt;&gt; 8) &amp; 0x00FF; 现在它可以工作了 :)
【解决方案2】:

了解:http://graphics.stanford.edu/~seander/bithacks.html 进行各种操作。

right_byte = short_val & 0xFF; left_byte = (short_val >> 8) & 0xFF short_val = ( (left_byte & 0xFF)

我总是做一个 &0xFF 掩码以确保我没有符号问题。

【讨论】:

    【解决方案3】:

    当你屏蔽掉高字节时,你还需要下移 8 位,否则你只会得到一个 16 位的数字,而后八位被清除。

    字节 grpixh = (grpix & 0xFF00) >> 8

    此外,使用 or-equals 代替 plus-equals 可以提高您的作文效率:

    grpix |= grpixh

    【讨论】:

    • 在 16 位字中,这里的掩码是没有意义的,因为低 8 位已经被移位丢弃了。
    【解决方案4】:

    我用来解决这个问题的简单代码是:

    word=(msb<<8)+lsb;
    

    【讨论】:

      【解决方案5】:

      以下例程对我来说非常可靠:-

      unsigned short get16int(a) char *a;{
         unsigned short hi,lo;
         hi = *a++ << 8;
         lo = *a  & 0x00ff; /* Needed to cater for sign extending when msb bit is set */
         return (hi | lo);
      }
      put16int(a,i) char *a; int i;{
       *a++ = i >> 8;
       *a = i;
      }
      

      【讨论】:

        猜你喜欢
        • 2022-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-07
        相关资源
        最近更新 更多