TL;dr:如何在没有随机文本的情况下将无符号32位整数转换为chars/uint8_t
好的,我愿意为此牺牲几个声誉点。我需要快速将一个4字节的无符号整数转换为数组字节,以便读取/写入/操作我自己结构的二进制文件。
这样我就可以读取一个结构,然后将其用作对象,而不是读取它,为每个更改写入它。
但是当我尝试实现一个函数时,我得到了一个泄漏。指针只是不断在函数范围之外添加值。
void trans_byte( uint32_t &A, uint8_t *out ){
// i did this with loop too same thing happens
uint8_t *ptr = (uint8_t*)&A;
out[3] = *ptr;
ptr++;
out[2] = *ptr;
ptr++;
out[1] = *ptr;
ptr++;
out[0] = *ptr;
ptr = ptr - 4;
}
uint32_t trans_ray( uint8_t *in ){
return ( in[0] << 24 ) | ( in[1] << 16 ) | ( in[2] << 8 ) | in[3];
}
主要:
int main(){
std::cout << "SHUGA" << std::endl; // test printing to see if test works
uint32_t ADR = 0x6D4E4344; // memory should write magic of mNCD
uint8_t ret[4];// array to be "outed" from function
trans_byte(ADR, ret); // function
uint8_t ret2[4] = { ret[0], ret[1], ret[2], ret[3] }; //copy of array to see if issue happens if i copy it
std::cout << ret << std::endl; // printing the array 1
std::cout << ret2 << std::endl; // printing the array 2
}
和输出:
SHUGA
mNCDmNCD // keep in mind I called the function only once.
mNCD
在我添加到main之后
std::cout << "shiya" << std::endl;
uint32_t ADR2 = trans_ray(ret);
std::cout << ret << std::endl;
std::cout << ret2 << std::endl;
std::cout << (ret==ret2) << std::endl;
然后我得到了这个可爱的混乱:
SHUGA
mNCDmNCD─[uÉ@
mNCD─[uÉ@
shiya
mNCDmNCD─[uÉ@
mNCD─[uÉ@
0
所以我猜这是某种内存泄漏,指针会继续读取内存或稍后的内容(因此会有过多的符号)。
那么,我怎样才能从uint32_t到uint8_t
来回转换,
而不用指针继续读取和操作数组,即使它没有被调用呢?
在您开始注释之前:< br >我不想使用< code>std::vector,因为我不想在现有的大型项目(无论是file还是PE)中为每个文件添加20kb左右的二进制数据。< br >我不能使用< code>std::string,因为我不想寻找字符串结尾< code>\x00。< br >我尝试使用< code>unions,但是字节是颠倒的,对于幻数和类似的东西,我需要它们按顺序排列。即使我尝试反转数组,我仍然需要处理这个问题。< br >我尝试使用< code>struct-ures和< code>class-es,但是当我更改object中的某些内容并需要更新文件时,我在编写代码块时仍然会遇到这个问题。
如何将无符号的 32 位整数转换为没有随机文本的 chars/uint8_t
您可以< code>union来实现这一点,但是您必须了解字节序。试试这个:
#include <stdint.h>
union {
uint32_t _32ui;
uint8_t _8ui[4];
}
我尝试使用联合,但字节是颠倒的,对于幻数和类似的数字,我需要它们保持有序。即使我尝试反转数组,我仍然需要解决这个问题。
在big-endian或litt-endian顺序中有转换uint32_t
的函数。我不确定您的操作系统、处理器和编译器。但是有像htonl这样的函数可用于Linux
。
所以我猜这是某种内存泄漏,指针会继续读取内存或稍后的内容(因此会有过多的符号)。
不,这不是问题所在。您没有在程序中分配任何会导致内存泄漏的内存,也没有超过分配的内存缓冲区。问题是您没有通过std::c
留档,您可能忽略了编译器的警告。
< code>std::cout已为C样式字符串重载,它需要< code >空终止字符数组。但是你没有提供空字符数组。我建议写一个简单的函数来打印你的数组。
void printArray(uint8_t *array, size_t size)
{
for (size_t i = 0; i < size; i++)
std::cout << array[i];
std::cout << std::endl;
}
std::cout << ret
这需要一个空终止的字符串(此处的信息):
8) 输出一个实现定义的字符串,就好像通过 *this
否则,它将继续打印,直到找到\0
。
这就是为什么我们使用向量,字符串等。忘记所有这些C风格的80年代的程序。除非你正在用20KB RAM编写超级微控制器,否则内存应该不是问题。
问题内容: 我们知道node.js为我们提供了强大的功能,但强大的功能带来了巨大的责任。 据我所知,V8引擎不进行任何垃圾收集。因此,我们应该避免什么最常见的错误,以确保没有内存从节点服务器泄漏。 编辑: 对不起,V8确实具有强大的垃圾收集器。 问题答案: 据我所知,V8引擎不进行任何垃圾收集。 V8内置了强大而智能的垃圾收集器。 您的主要问题是不了解闭包如何维护对外部函数的范围和上下文的引用。这
问题内容: 我正在设计一个Web应用程序,该应用程序旨在显示一堆使用AJAX定期更新的数据。一般的使用场景是用户将整天保持打开状态,然后不时浏览一下。 我遇到的问题是浏览器的内存占用量随时间缓慢增长。Firefox和IE 7(尽管不是Chrome)都在发生这种情况。几个小时后,它可能导致IE7占用约200MB的内存,而FF3导致占用约400MB的内存。 经过大量测试,我发现只有在响应AJAX调用时
问题内容: 由于这是我第一次学习系统编程,因此我很难将规则束之高阁。现在,我对内存泄漏感到困惑。让我们考虑一个例子。说,Rust正在抛出一个Python将会捕获的指针(指向字符串)。 在Rust中,(我只是发送的指针) 在Python中,(我取消引用了指针) 现在,我的问题是释放内存。我认为应该在Python中将其释放,但随后所有权会突然增加。因为,似乎采用了不可变的参考。因此,我对于是否应该在R
问题内容: 我根据教程实现了加密过程: http://www.openssl.org/docs/crypto/EVP_EncryptInit.html# 当我运行它通过低谷并得到以下报告: 我下载了OpenSSL的源代码。在ERR_put_error内部,我看到了ERR_get_state中的内存分配,并在err_clear_data内部释放了内存,但是累积了err_clear_data内部的逻辑
在阅读了大量有关MAT的内容后,我使用我的生产堆转储来分析内存泄漏问题。下面是泄漏报告错误: 线程org.apache.tomcat.util.threads.taskthread@0x6d8be0a30 http-bio-8443-exec-115保留总大小为3,695,816,440(89.03%)字节的局部变量。 内存累积在“'<'System class Loader'>”加载的“java
我正在尝试为我们的系统添加一个脚本功能,不受信任的用户可以编写简单的脚本,并让它们在服务器端执行。我正在尝试使用Nashorn作为脚本引擎。 不幸的是,他们为Nashorn添加了一些非标准功能: https://docs.oracle.com/javase/8/docs/technotes/guides/scripting/nashorn/shell.html#sthref29 向下滚动至“Add