gpt4 book ai didi

c++ - 如何检查十六进制数字数组中的某个位是否启用

转载 作者:行者123 更新时间:2023-11-28 03:48:28 25 4
gpt4 key购买 nike

#include<iostream>
#define check_bit(var,pos) {return (var & (1 << pos))!=0;}

using namespace std;

int main()
{
uint8_t temp[150]={0x00,0x02,0x17,0xe2,0x1c,0xa8,0x00,0x30,0x96,0xe1,0x8c, 0x38,
0x88, 0x47, 0x00 ,0x01 ,
0x30, 0xfe, 0x00, 0x01 ,0x31, 0xfe, 0x45, 0x00, 0x00 ,0x64, 0x3b, 0x89 ,0x00, 0
x00 ,0xfe, 0x01 ,
0x33, 0x5a, 0xc0 ,0xa8 ,0x79 ,0x02 ,0x0a, 0x0a, 0x0a, 0x01, 0x08, 0x00, 0xe3, 0
x86, 0x00, 0xea,
0x01, 0xd2, 0x00, 0x00, 0x00, 0x05, 0x02, 0x6a, 0x95 ,0x98, 0xab ,0xcd ,0xab, 0x
cd ,0xab, 0xcd,
0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd ,0xab, 0xcd ,0xab ,0
xcd ,0xab, 0xcd,
0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd ,0xab ,0xcd ,0xab ,0
xcd, 0xab ,0xcd,
0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd , 0xab, 0xcd ,0xab, 0xcd, 0xab, 0
xcd, 0xab ,0xcd,
0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd, 0xab, 0xcd , 0xab, 0xcd
};

uint16_t *ptr1=(uint16_t*)&temp[0];

while(!(*(ptr1+0)==0x88 && *(ptr1+1)==0x47))
{
ptr1++;
}

cout<<"MPLS packet";

uint32_t *ptr2=(uint32_t*)&temp[0];

cout<<"4 bytes accessed at a time";

ptr2++;

while(check_bit(*(ptr+3),7)!=1)
{
cout<<"bottom of the stack:label 0";
ptr2++;
}
cout<<"mpls label:1";
return 0;
}

该程序旨在通过一次访问两个字节并检查是否存在 88 和 47 个数据包来识别数据包是否为 MPLS,如果是 MPLS 数据包,则它应该一次访问四个数据包并检查第三个字节(本例中为 30案例)是否启用。如果未启用,则访问接下来的四个字节并检查字节是否启用。我已经编写了程序,但它不工作。请有人帮助我。我无法访问数组的单个元素。如果我给cout<<temp[0]它提供了垃圾值(value)

请帮忙

最佳答案

我注意到的第一件事是您的代码查找连续的 16 位值 0x88 和 0x47,但在数据包本身中,这些值似乎是 8 位(每个 1 字节)。如果将 ptr1 更改为 uint8_t*,它将能够找到值。我不知道其余代码的正确行为是什么,所以我无法检查它。

一般来说,在这里直接从内存中读取大于 8 位的值(例如 uint16_t 或 uint32_t)可能不是一个好主意,因为您的程序在小端和大端处理器上的行为会有所不同。正如 ydroneaud 在评论中提到的那样,一些处理器将无法读取这些值,因为您是从未对齐的地址中读取它们的。

关于c++ - 如何检查十六进制数字数组中的某个位是否启用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6594515/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com