gpt4 book ai didi

C 编程 : strtol() and Dealing with NUL Bytes

转载 作者:太空宇宙 更新时间:2023-11-04 04:54:20 24 4
gpt4 key购买 nike

假设我有一个地址和一个偏移量,例如:

   char* base_addr = "\x00\x00\x00\xb7";
char* addr_offset = (user input);

我想将 base_addr 和 addr_offset 加在一起。我是否必须编写自己的 strtol() 函数,该函数不会在 NUL 处终止,或者是否有其他方法可以成功添加这两个地址?

编辑:

忘了说这是 Linux x86。

最佳答案

base_addr 实际上是一个 32 位整数值,恰好是使用字节常量进行硬编码的。您应该简单地将指针的类型转换为 unsigned long,然后对用户输入的字符串调用 strtol(),然后将两者相加。

以这种方式使用字符串对指针进行硬编码是很蹩脚的。一方面,C 将在字符串的末尾添加一个 NUL 字节,因此现在您的 32 位值需要 5 个字节,并且添加填充字节后您最终可能会使用 8 个字节来存储您的指针,正好是所需的两倍.最好这样做:

char base_addr[] = {'\x00', '\x00', '\x00', '\xb7'};

只要编译器允许您进行类型转换,最好只说出您的意思:

unsigned char *base_addr = (unsigned char *)0xb7000000;

我刚刚检查过,GCC 允许您在没有错误或警告的情况下执行上述操作。

编辑:哦,好的,真正的问题是如何访问整数值中的字节。

你应该能够通过弄乱指针来做到这一点:

unsigned long base_adr = 0xb700000000;
unsigned char *p = (unsigned char *)&base_adr;

上述技巧适用于整数类型。另一种方法是使用 C union :

typedef union
{
char bytes[4];
unsigned long n;
unsigned char *ptr;
} ADR_WINDOW;

ADR_WINDOW x;

x.n = 0xb700000000;
assert(x.bytes[3] == 0xb7); // on a little-endian computer
assert(x.bytes[0] == 0xb7); // on a big-endian computer

union 技巧适用于任何类型,并且是唯一可移植的方式来执行低级技巧,例如查看浮点值中的位。

关于C 编程 : strtol() and Dealing with NUL Bytes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11004671/

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