提问人:NotAidan 提问时间:11/5/2023 最后编辑:NotAidan 更新时间:11/5/2023 访问量:73
unsigned char * 根据 c++ 中的操作系统/编译器更改长度 [closed]
unsigned char * changing length depending on OS/Compiler in c++ [closed]
问:
我在我的代码中发现了一个奇怪的错误。我的代码应该与 Windows 和 Linux 交叉兼容。我发现当我编译我的程序窗口 mingw 时,它在获取其长度时会向特定数据类型/变量添加 6 个字节。
我不知道如何进一步解释,所以这是我发现的
int paddingSize = strlen((char*)cipherText);
我将 cipherText 定义为一个无符号字符 *,它是一个原始加密的 aes-256 字节数组。 在 Linux 上编译上述代码片段时,如果数组大小为 16 字节,则 int 将为 16。 但是,在 Windows 上编译时,每次都会有正好 +6 字节的偏移量。为了解决这个问题,我使用了下面的片段
int paddingSize = strlen((char*)cipherText) - 6;
我想知道为什么会这样?这是编译器问题,例如 mingw vs G++ (GNU)吗?还是架构问题?这是否也是一个数据类型问题,类型转换在一个操作系统上破坏了它,而在另一个操作系统上却没有?
我尝试过不同的事情,但都得到了令人困惑的答案。
答:
1赞
Klaus
11/5/2023
#1
strlen
计算字节数,直到找到字符。如果你指向一个长度为 16 的字符数组,则结果只是给你找到第一个 ' 之前的字符数,完全独立于数组的长度!也有可能您的 prog 只是崩溃,因为您访问了阵列后面的内存。'\0'
y
strlen
'\0
您无法从指向 char 的指针获取数组的长度。
可以使用 来获取变量的大小。如果是指针,它会返回指针本身的大小,通常为 8,具体取决于您正在运行的机器类型。sizeof()
你应该完全避免类型转换
评论
y
cipherText
cipherText
y
cipherText
strlen
std::strlen
int
std:size_t
)data()