假设我有一个文件,该文件包含:
HelloxxxHelloxxxHello
Run Code Online (Sandbox Code Playgroud)
我编译一个模式来寻找'你好'
Pattern pattern = Pattern.compile("Hello");
Run Code Online (Sandbox Code Playgroud)
然后我使用输入流来读取文件并将其转换为String,以便可以对其进行重新编码.
一旦匹配器在文件中找到匹配项,它就表明了这一点,但它没有告诉我它找到了多少匹配项; 只是它在String中找到了匹配项.
因此,由于字符串相对较短,并且我使用的缓冲区是200字节,因此它应该找到三个匹配项.但是,它只是简单地说匹配,并没有向我提供有多少匹配的计数.
计算String中发生的匹配数的最简单方法是什么.我已经尝试了各种for循环并使用matcher.groupCount(),但我无处可去.
我只是在编写PE文件解析器的过程中,我已经达到了解析和解释PE文件中实际代码的程度,我假设它存储为x86操作码.
例如,DLL中的每个导出都指向函数将存储在内存中的RVAs(相对虚拟偏移),并且我编写了一个函数来将这些RVA转换为物理文件偏移.
问题是,这些是真正的操作码,还是其他的?
是否依赖于编译器/链接器关于函数如何存储在文件中,或者它们是一个还是两个字节的X86操作码.
例如,Windows 7 DLL"BWContextHandler.dll"包含四个加载到内存中的函数,使它们在系统中可用.第一个导出的函数是'DllCanUnloadNow',它位于文件中的偏移0x245D处.该数据的前四个字节是:0xA1 0x5C 0xF1 0xF2
这些一个或两个字节的操作码是这样的,还是完全不同的?
如果任何人都可以提供有关如何检查这些信息的任何信息,我们将不胜感激.
谢谢!
经过一些进一步的阅读,并通过IDA的演示版本运行文件,我认为我说第一个字节0xA1是一个单字节操作码,这意味着mov eax.我从这里得到了它:http://ref.x86asm.net/geek32.html#xA1,我认为它暂时是正确的.
但是,我对下面的字节如何构成指令的其余部分感到困惑.从我所知道的x86汇编程序来看,移动指令需要两个参数,即目标和源,因此指令是将(某些)移动到eax寄存器中,并且我假设某些内容来自以下字节.但是我不知道如何阅读这些信息:)
我有一个Linux内核模块,在它的初始化例程中,将一个4KB大小的结构写入内核内存.我想要做的是共享这个内存,以便单个用户空间进程可以对此结构具有只读访问权限.
我被告知要避免使用IOCTLS,因为它们不是最好的方法,所以从我读过的最好的方法就是使用这个功能mmap,但是我有点困惑关于如何在C中实现我需要的东西
我确实看过使用该功能shmget,但似乎这是为需要IPC功能的用户空间应用而设计的.
任何建议,甚至更好的简单例子将不胜感激.
谢谢!
我需要从长值中提取某些位范围,例如:
long input = 15367 (11110000000111)
Run Code Online (Sandbox Code Playgroud)
我需要做的是从原始long中提取两个long值,
First long is 5 bits starting from bit 0, so bits 0:4 = 7 (0111)
Second long is 56 bits starting from bit 8, so bits 7:55 = 60 (1111000)
Run Code Online (Sandbox Code Playgroud)
我知道这可以通过位移和屏蔽来完成,但是我并不完全确定如何实现它,因此每次都是动态的,因为每次我需要这样做时,长度将会不同,特定情况也是如此比特范围.
我一直在阅读BitSets和BitArrays,但我并不完全确定这些是正确的工作.
任何关于实现这一目标的最佳方式的建议将不胜感激.
谢谢!
我正在开发一个需要解析一些定制数据结构的C程序,幸运的是我知道它们是如何构造的,但是我不知道如何在C中实现我的解析器.
每个结构的长度为32位,每个结构都可以通过它的二进制签名来识别.
作为一个例子,有两个我感兴趣的特殊结构,它们有以下二进制模式(x表示0或1)
0000-00xx-xxxx-xxx0
0000-10xx-10xx-xxx0
Run Code Online (Sandbox Code Playgroud)
在这些结构中,'x'位包含我需要的实际数据,因此基本上我需要一种基于每个结构中如何写入位来识别每个结构的方法.
所以作为伪代码中的一个例子:
if (binaryPattern = 000010xxxxxxxxx0) {
do something with it;
}
Run Code Online (Sandbox Code Playgroud)
我猜测将它们作为整数读取,然后执行某种bitmasking将是要走的路,但我对C的了解并不是很好,也许一个简单的逻辑OR运算就可以做到,但我只想要一些在我开始之前做这个的建议.
谢谢
非常感谢所有回答的人,非常有帮助!
我刚刚使用Java 7 WatchService来监视文件以进行更改.
这是我敲了一下的一些代码:
WatchService watcher = FileSystems.getDefault().newWatchService();
Path path = Paths.get("c:\\testing");
path.register(watcher, StandardWatchEventKinds.ENTRY_MODIFY);
while (true) {
WatchKey key = watcher.take();
for (WatchEvent event : key.pollEvents()) {
System.out.println(event.kind() + ":" + event.context());
}
boolean valid = key.reset();
if (!valid) {
break;
}
}
Run Code Online (Sandbox Code Playgroud)
这似乎有效,我收到有关何时修改文件'changethis.txt'的通知.
但是,除了能够在文件发生变化时进行通知外,是否还有关于文件中发生修改的位置的通知?
我已经浏览了Java文档,但我似乎找不到任何东西.
这可能是使用WatchService,还是必须实现自定义?
谢谢
我目前正在使用Socket.io的Java实现,可在此处获取:netty-socketio
我已经启动并运行了服务器,它在客户端和服务器之间很好地接收/发送消息,但是我需要在接收到某些消息时触发事件,这就是我感到困惑的地方.
这是我的代码:
server.addEventListener("message", clientData.class, new DataListener<clientData>() {
@Override
public void onData(SocketIOClient client, clientData data, AckRequest ackRequest) throws Exception {
System.out.println("Message from client: " + data.getMessage());
}
});
public class clientData{
String message;
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
Run Code Online (Sandbox Code Playgroud)
}
基本上我想要发生的是当从客户端收到特定消息时,我需要在另一个类中运行一个函数.我花了持续两个小时阅读Observable,Observer,Interfaces和事件处理程序,但我真的不知道如何处理此问题.
图书馆也提到了这一点DataListener,但我不知道那是什么,因为图书馆里的文档很少.
任何意见或建议将不胜感激.
谢谢
我正在尝试int从String数组元素中解析一个.这是我的代码:
String length = messageContents[k].replace("Content-Length:", "").replace(" ", "");
System.out.println("Length is: " + length);
int test= Integer.parseInt(length);
Run Code Online (Sandbox Code Playgroud)
将System.out.println返回如下:长度为:23
但是,当我尝试解析String成一个时int,一个java.lang.NumberFormatException被抛出;
java.lang.NumberFormatException: For input string: "23"
Run Code Online (Sandbox Code Playgroud)
我有点困惑23如何解析成一个int.我只能假设其中有一些其他角色正在阻止它,但我不能在我的生命中看到它.
有什么建议?
谢谢
更新
Despite the String length having only two characters, Java reports its length as three:
Length is: '23'
Length of length variable is: 3
length.getBytes = [B@126804e
Run Code Online (Sandbox Code Playgroud) 我目前正在使用Linux内核模块,我需要访问存储在数组中的一些64位值,但是我首先需要从void指针进行转换.
我正在使用phys_to_virt返回void指针的内核函数,我不完全确定如何实际使用此void指针来访问它指向的数组中的元素.
目前我这样做:
void *ptr;
uint64_t test;
ptr = phys_to_virt(physAddr);
test = *(uint64_t*)ptr;
printk("Test: %llx\n", test);
Run Code Online (Sandbox Code Playgroud)
我从测试中获得的值不是我期望在数组中看到的值,所以我很确定我做错了什么.我需要访问数组中的前三个元素,所以我需要将void指针强制转换为uint64_t [],但我不太清楚如何做到这一点.
任何建议将不胜感激.
谢谢
我尝试在最新版本的 Chrome (75.0.3770.142) 中运行它,但我没有获得任何搜索参数。例如:
let params = (new URL("http://blah.com?q=something")).searchParams;
Run Code Online (Sandbox Code Playgroud)
这只是返回一个空对象,因此查询字符串尚未被解析。我尝试了多个示例,但它们都返回一个空对象。我在这里做错了什么吗?