我想连接2个非字符串类型,以便可以将它们用作一种。 这是我代码的主要部分:
#include<stdio.h>
#include<string.h>
#include<windows.h>
int main() {
HANDLE hwnd = FindWindowA(NULL, "MyProgram");
DWORD ProcessId; GetWindowThreadProcessId(hwnd, &ProcessId);
HANDLE handler = OpenProcess(PROCESS_ALL_ACCESS, FALSE, ProcessId);
... ??? (type im not sure about) = 0x; ??? ...
... ??? (type im not sure about) MemoryAddress; ??? ...
int ValueOfAddress;
ReadProcessMemory(handle, (LPVOID)(concatenated 0x+MemoryAddress), &ValueOfAddress, sizeof(ValueOfAddress), 0);
printf("Value Of Address %? Is %d", (concatenated 0x+MemoryAddress), ValueOfAddress);
return 0;
}
我需要将0x连接到我通过ReadProcessMemory找到的内存地址(例如0x0023DA44,0x是0x,0023DA44是从内存中读取的值)。感谢您提供的任何帮助:)很抱歉,如果这样做没有意义,我不太善于解释。基本上,我需要知道如何连接到DWORD数据类型以获得内存地址类型变量。任何帮助,如果不胜感激!
答案 0 :(得分:1)
如果我理解正确,则想从包含例如"DEADBEEF"
到整数值0xDEADBEEF
?您正在寻找strtol
函数系列。
void *ptr = (void *)strtoull("DEADBEEF", NULL, 16);
您可以执行以下操作:
ReadProcessMemory(handle, ptr, &ValueOfAddress, sizeof(ValueOfAddress), 0);
printf("Value Of Address %p Is %d", ptr, ValueOfAddress);
请注意,该代码中没有错误检查(特别是,您应该检查该值是否适合指针,并且该字符串是有效的十六进制)。
答案 1 :(得分:0)
变量MemoryAddress
中的数据是指针,而不是字符串。必须先将其转换为字符串,然后才能与其他字符组合。 C不会自动执行此转换。
printf()
函数能够接受指针(以及整数和其他类型的数字)并将其转换为字符,然后再打印它们。这就是格式说明符所做的工作(例如%d
的意思是“获取下一个参数并将其从带符号的int转换为字符,然后在此处插入字符”)。
换句话说,您可以这样做:
printf("Value At Address %p Is %d", (void *)MemoryAddress, ValueOfAddress);
问题是C语言中的指针是抽象的,可能不是简单的数字(例如,它们可能是两段,例如“ segment:offset”);指针的显示方式以及实现方式必须进行定义,以便代码可移植,并且由于定义了实现,因此它可能会或可能不会使用十六进制,并且可能会或可能不会使用0x
前缀(取决于编译器的感觉)
换句话说; %p
的意思是“获取下一个参数,并使用对特定类型的CPU有意义的参数将其从void指针转换为字符,然后在此处插入字符”。
强制指针为单个数字,并强制printf()
以十六进制显示该单个数字(不带后缀0x
);如果您使用的是C99(或更高版本),则可以#include <inttypes.h>
并执行以下操作:
printf("Value At Address " PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);
现在,我们又回到了原始问题-如何连接0x
后缀? C实际上并不真正在内部支持运行时连接(例如,您需要使用与字符串相关的库函数-例如strcat()
),而仅在内部支持编译时字符串连接;并将MemoryAddress
转换为字符,然后与strcat()
进行串联,然后打印串联的字符串将很麻烦。最简单的解决方案是避免串联,而将0x
放入格式字符串中,如下所示:
printf("Value At Address 0x" PRIXPTR " Is %d", (uintptr_t)MemoryAddress, ValueOfAddress);
答案 2 :(得分:0)
您不需要进行任何串联。
在此上下文中, public void cadastrarTAG(ModeloTAG tag) throws JSONException {
...
/* read bytes */
try {
final byte[] fileBytes = getFileBytes(new File(tag.getPath));
json.put("image", Base64.encodeToString(fileBytes, Base64.DEFAULT));
} catch (FileNotFoundException e) {
// Handle the exception
} catch (IOException e) {
// Handle the exception
}
...
}
private byte[] getFileBytes(final String path) throw IOException, FileNotFoundException {
final FileInputStream fis = new FileInputStream(new File(path));
final ByteArrayOutputStream bos = new ByteArrayOutputStream();
final byte[] buffer = new byte[2048];
int read = 0;
while ((read = fis.read(buffer, 0, buffer.length)) > 0) {
bos.write(buffer, 0, read);
}
fis.close();
return bos.toByteArray();
}
只是应用于数字常量的前缀,以指示给定值采用十六进制格式。不论分配给0x
的任何值(我假设是指针类型),都可以单独作为第二个参数传递给MemoryAddress
。