我如何编写一段代码来判断短信的第一个字节,而不是第二个字节?
Eaxmple: 我有一个名为inputShort的short,我希望这个简短的删除第二个字节中的所有值。所以我想和逻辑运算符一起使用它。
好吧,我试过了,但我失败了。那么有人能给我一个如何做到这一点的例子吗?
我的目标是保留短片的左侧部分,并清空短片的右侧部分。
答案 0 :(得分:7)
当你说“第二个字节”时,我不知道你的意思是最重要还是最不重要,但这里有一个可能有帮助的例子。
short second = 0xFF00;
short first = 0x00FF;
short number = 0x1234;
short tmp;
tmp = number & first; //tmp is set to 0x1234&0x00FF -> 0x0034
tmp = number & second; //tmp is set to 0x1234&0xFF00 -> 0x1200
答案 1 :(得分:7)
“第一”和“第二”是模棱两可的。他们倾向于提到存储,所以endian-ness发挥作用,我认为你不是那个意思。短路中的字节数也是实现定义的。
我假设您要将最低有效位(“右”)置零,并保留所有其他位:
#include <limits>
...
inputShort & ~std::numeric_limits<unsigned char>::max();
或者,如果你感到勇敢,并且你想假设8位字节:
inputShort & ~0xFF;
(假设8位字节不需要太多勇气)。
答案 2 :(得分:3)
很简单:res = inputShort & 0xff00
如果您愿意,也可以使用>>
将第二个字节转换为低位字节:
unsigned short res = (inputShort & 0xff00) >> 8
答案 3 :(得分:2)
假设16位short
s:
#include<stdio.h>
int main(void) {
unsigned short val = 0xbaba;
unsigned short mask = 0xff00;
unsigned short result = val & mask;
printf("%04x\n", result);
return 0;
}
输出:
E:\tmp> t ba00
答案 4 :(得分:0)
好的,我写了这个方法:
short Game::swapShort(short inputShort)
{
short tempA;
short tempB;
tempA = ((inputShort & 0xff00) >> 8);
tempB = ((inputShort & 0x00ff) << 8);
short total = tempA + tempB;
return total;
}
我认为应该正常工作。
但是,我的inputShort将成为我程序中的指针。有人也可以向我解释我如何调整我的方法来使用短指针吗? :$
答案 5 :(得分:0)
回应Krunk上面的评论: 首先,您可能想要这样做:
short total = tempA | tempB;
你在逻辑上尝试OR它们,而不是添加它们。如果你想用inputShort作为指针来做这件事,那就很容易了,但是你也可以使用引用代替,所以你不必乱用dereferencing指针。此外,在处理签名类型时,必须小心自动符号扩展。如果你正在对具有最高位设置的值进行右移,那么你正在处理负数的移位..那么,让我给你一个例子:
short foo = -5;
我们现在假设16位短路。 在二进制补码二进制中
1111 1111 1111 1011
如果我们将它右移1,我们就会得到:
1111 1111 1111 1101
由于符号扩展,左侧的额外1是那里。 因此,让我们使用您的代码遍历字节交换-5:
tempA =((1111 1111 1111 1011)&amp; 0xff00)&gt;&gt; 8 所以,操作首先给了我们:
1111 1111 0000 0000
然后右移给我们:
1111 1111 1111 1111
这显然不是你想要的。
你可以这样做的一种方法就是使用重新解释。我假设您对swapShort的输入是短而不是无符号短路的原因?无论如何,我会把它留作简短的:
//我继续修改它以取一个短指针,就像Krunk问道。 //还要注意我们假设是16位短路。这种情况会在不存在这种情况的平台上中断。
void Game::swapShort(short *inputShort)
{
//Once we start treating it as unsigned, don't have to worry about sign extension.
unsigned short* tmp = (reinterpret_cast<unsigned short*>(inputShort);
unsigned short highByte = ((*tmp & 0xff00) >> 8)
*tmp = highByte | ((*tmp & 0x00ff) << 8);
}
或者,如果您真正尝试做的只是以网络字节顺序获取,有一种更简单的方法,您可以使用htons和ntohs:
一个例子是:
unsigned short foo = 300;
//htons = host to network short
unsigned short foo_net_byte_order = htons(foo);
使用htons及其等价物的好处是,如果你在大端系统上运行代码,htons&amp; amp; ntohl基本上是无操作的,但它实际上会在一个小端系统上交换它们。也就是说,在确定是否需要交换之前,您不必弄清楚正在运行的系统的字节顺序。 htons知道网络字节顺序意味着什么以及你的主机字节顺序是什么,它只会为你处理它。长期也有等价物。见http://msdn.microsoft.com/en-us/library/ms738557%28VS.85%29.aspx
POSIX类型的操作系统也存在相同的功能,但您必须包含一组不同的标题。