按位运算符:如何检查源端口是否大于 32767 (0x7FFF)
Bitwise operators: How to check if source port is great than 32767 (0x7FFF)
我有一个程序可以读取一个 20 字节的二进制文件,修改数据然后写入另一个二进制文件。我正在尝试检查源端口是否大于 32767 或 (0x7FFF)。
如果它更大,那么我必须将它的最高有效两位归零。我只被允许使用按位运算符。任何人都知道我该怎么做?谢谢
Data: 32 27 A9 49 03 8C BD 89 01 87 9B 8D 50 13 00 00 FF FF 00 00
Source port: 32 27 (16 bits)
void modify(const unsigned char oldData [], unsigned char newData []){
/*Accessing the souce port oldData[0] and oldData[1].*/
}
从数据中挑出端口值即可。这取决于字节顺序。小或大。
您需要了解数据的组织方式 - 32 是高位还是低位。
假设你的数据是小端的,你可以这样读:
#include <endian.h>
void modify()
{
uint16_t port = le16toh( *((uint16_t*)oldData) );
if(port>32767)
{/*whatever*/}
对于检查 >=32768 的特殊情况,即 >=0x8000,可以像已经评论的那样测试高位:
if(oldData[1]&0x80) // [1] is highbyte if using little-endian data.
{/*whatever*/}
我有一个程序可以读取一个 20 字节的二进制文件,修改数据然后写入另一个二进制文件。我正在尝试检查源端口是否大于 32767 或 (0x7FFF)。 如果它更大,那么我必须将它的最高有效两位归零。我只被允许使用按位运算符。任何人都知道我该怎么做?谢谢
Data: 32 27 A9 49 03 8C BD 89 01 87 9B 8D 50 13 00 00 FF FF 00 00
Source port: 32 27 (16 bits)
void modify(const unsigned char oldData [], unsigned char newData []){
/*Accessing the souce port oldData[0] and oldData[1].*/
}
从数据中挑出端口值即可。这取决于字节顺序。小或大。
您需要了解数据的组织方式 - 32 是高位还是低位。
假设你的数据是小端的,你可以这样读:
#include <endian.h>
void modify()
{
uint16_t port = le16toh( *((uint16_t*)oldData) );
if(port>32767)
{/*whatever*/}
对于检查 >=32768 的特殊情况,即 >=0x8000,可以像已经评论的那样测试高位:
if(oldData[1]&0x80) // [1] is highbyte if using little-endian data.
{/*whatever*/}