unsigned char * 根据 c++ 中的操作系统/编译器更改长度 [closed]

unsigned char * changing length depending on OS/Compiler in c++ [closed]

提问人:NotAidan 提问时间:11/5/2023 最后编辑:NotAidan 更新时间:11/5/2023 访问量:73

问:


编辑问题以包括所需的行为、特定问题或错误以及重现问题所需的最短代码。这将帮助其他人回答这个问题。

17天前关闭。

我在我的代码中发现了一个奇怪的错误。我的代码应该与 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)吗?还是架构问题?这是否也是一个数据类型问题,类型转换在一个操作系统上破坏了它,而在另一个操作系统上却没有?

我尝试过不同的事情,但都得到了令人困惑的答案。

C Linux G++ 类型转换运算符

评论

2赞 KamilCuk 11/5/2023
请以最少的可重现示例发布完整的代码。您是在编译 C 还是 C++?如果是 C++,则不标记 c。最简单的答案是,您的代码存在错误,或者不指向以零字节结尾的内存区域。ycipherText
1赞 Harith 11/5/2023
Do 并指向以 null 结尾的字符串?cipherTexty
2赞 n. m. could be an AI 11/5/2023
字符串是以 null 结尾的字符数组。它看起来像 isa 不是一个字符串,你不能用 .cipherTextstrlen
1赞 Pepijn Kramer 11/5/2023
你的编码风格已经过时了。不应再使用任何仍在使用原始指针、“C”样式字符串和 strlen 等调用的代码。使用 std::string(或 std::vector<std::uint8_t>以防您的密码文本中有“\0”字符(这很有可能)。你用什么来源来学习 C++,它也可能已经过时了。作为列表旁注,您的字符串长度不是 an,而是 a(在您使用的类型中要精确,请参阅 std::strlenintstd:size_t)
1赞 Pepijn Kramer 11/5/2023
不,这不是真的,你可以使用 vector 的方法获取指向数据的指针,你可以将其转发到“C”。因此,您可以使用 std::vector<unsigned char>。对于返回的 char*,您可以使用 std::string_view(从 char* 和 length 构造)。同样有趣的是,该库是否只返回一个 char* 或大小信息(如果不是,事情变得困难),以及您应该稍后释放内存的内存是谁?如果是这样,请使用 std::unique_ptr 获取所有权。总结:在当前的 C++ 中编写尽可能多的代码,只在边界上进行调整。data()

答:

1赞 Klaus 11/5/2023 #1

strlen计算字节数,直到找到字符。如果你指向一个长度为 16 的字符数组,则结果只是给你找到第一个 ' 之前的字符数,完全独立于数组的长度!也有可能您的 prog 只是崩溃,因为您访问了阵列后面的内存。'\0'ystrlen'\0

您无法从指向 char 的指针获取数组的长度。

可以使用 来获取变量的大小。如果是指针,它会返回指针本身的大小,通常为 8,具体取决于您正在运行的机器类型。sizeof()

你应该完全避免类型转换