我有能力用 Lua 读取内存,但我遇到了问题。我想读取一个浮点值。
我有,我认为是一个浮点数,在看起来像这样的内存中。
Byte Array 65 B6 40 43 EC 35 87 41 51 04 9E 3F
Float Value 192.712478637695
Run Code Online (Sandbox Code Playgroud)
我知道浮点值,因为我使用的是内存编辑器。在 Lua 中,我有一个类似于 memcpy 的函数,它被称为 readmem(Address,bytes) 它返回一个整数值。
我如何使用 readmem 将字节数组读入 Lua 中的浮点数。
为了这个问题,我想你可以假设 65 中的 6 是地址 00000000。
我需要读取 0x2428(MCU 的闪存)地址中的值。如何使用 memcpy 读取值?
uint8_t *newData ,x;
memcpy( newData, 0x2428, sizeof x);
Run Code Online (Sandbox Code Playgroud)
但是,我得到
错误[Pe167]:“int”类型的参数与“void const *”类型的参数不兼容
我应该如何修复错误?
例如,如何连接两个字符串
char s[5]={'s','a','\0','c','h'};
char m[11]={'b','e','\0','c','h','b','\0','e','\0','c','h'};
Run Code Online (Sandbox Code Playgroud)
有许多空字符。我试过了strcat()。它不工作。有什么办法吗?
我已经看到memmove 和 memcpy 的区别是什么?它说memmove might be very slightly slower than memcpy。
我们可以memmove通过执行以下操作来实现替代方法:分配一个临时缓冲区,然后memcpy两次(src -> tmp,tmp -> dest)。我的问题是:哪种方式更快,memmove或者另一种选择?
如何编写一个函数,将给定数量的字节从给定的源复制到 AARCH64 汇编语言的给定目的地?这基本上就像 memcpy,但有一些额外的假设。
到目前为止,我找到的最好的资源是memcpy 的源代码,但我不明白哪些部分与我给出的特定参数相关。
编辑:到目前为止,我已经尝试将 C 中的以下函数转换为程序集。
void memcpy80(unsigned char* dest, unsigned char* sourc, unsigned long count)
{
unsigned char* end = sourc + count;
while (sourc < end)
*(dest++) = *(sourc++)
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试将其归结为符合规范的版本,如下所示:
memcpy80:
add x3, x1, x2
loopstart:
cmp x3, x1
//how do I branch to loopend if x1 > x3?
add x0, x0, 1
add x1, x1, 1
ldr x4, [x1]
str x4, [x0]
b …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我无法理解以下代码memcpy在循环中的第二个崩溃(没有任何错误消息;gcc 7.4.0 Ubuntu 16.04,QT5)所以我猜我的指针算法是错误的,但我不明白为什么:
#include <stdio.h>
#include <string.h>
#define ROWS 48
#define COLS 48
#define CHANNELS 3
#define NUM_PIX ((ROWS) * (COLS) * (CHANNELS))
struct MyImage
{
int width;
int height;
int channels;
unsigned char rawData[NUM_PIX];
};
int main()
{
const int numIm = 16;
MyImage theClsImArr[numIm];
unsigned char ImArr[numIm][ROWS][COLS][CHANNELS];
int Bytes2Copy = NUM_PIX * sizeof(unsigned char);
for (int i = 0; i < numIm; i++ )
memcpy(theClsImArr[i].rawData,ImArr + i * NUM_PIX ,Bytes2Copy ); // works when i …Run Code Online (Sandbox Code Playgroud) 我正在尝试打开一个二进制文件并从中读取标题。我能够以一系列整数读取它,但我决定将它转换为一个结构体以允许 n 个对象。但是,我每次都面临不同的问题,它们都与结构引入的填充有关。当我尝试
struct {
int x1;
int x2;
long long x3;
long long x4;
} info;
Run Code Online (Sandbox Code Playgroud)
我遇到了一个问题,x1 和 x2 后跟大小为 4 的填充。
当我尝试
struct {
uint32 x1;
uint32 x2;
uint64 x3;
uint64 x4;
} info;
Run Code Online (Sandbox Code Playgroud)
我遇到了一个问题,其中 sizeof(info) 返回的大小远大于第一个结构。我想尝试 pragma pack,但我想要一个不依赖于 Visual Studio 的通用 Windows 解决方案。我知道正确排序声明以避免填充,但问题是顺序很重要,因为我正在使用memcpy(&info, bytes_array, sizeof(info)).
我想获得有关如何正确完成此操作的建议,即使这意味着我必须更改结构的外观。
我目前的代码:
unsigned int read_size = sizeof(info);
char* read_array = new char [read_size];
fin.read(read_array, read_size);
memcpy(&info, read_array, read_size);
Run Code Online (Sandbox Code Playgroud) 我想通过组合offsetof宏和memcpy,从某个元素开始向前复制结构的一部分,如下所示:
#include <stdio.h>
#include <string.h>
#include <stddef.h>
struct test {
int x, y, z;
};
int main() {
struct test a = { 1, 2, 3 };
struct test b = { 4, 5, 6 };
const size_t yOffset = offsetof(struct test, y);
memcpy(&b + yOffset, &a + yOffset, sizeof(struct test) - yOffset);
printf("%d ", b.x);
printf("%d ", b.y);
printf("%d", b.z);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望这会输出,4 2 3但它实际上输出4 5 6好像没有发生复制一样。我做错了什么?
我正在尝试将数组的内容复制到自身内部,但带有偏移量(或从偏移量)。例如:
int main(void) {
char a[4] = { 'a', 'b' , 'c', 'd' }, b[4], c[4];
memcpy(b, a, 4);
memcpy(c, b, 4);
memcpy(b, b + 1, 3);
memcpy(c + 1, c, 3);
for(unsigned i = 0; i < 4; i++)
printf("%c", b[i]);
printf("\n");
for(unsigned i = 0; i < 4; i++)
printf("%c", c[i]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
给出以下输出:
bcdd
aaaa
Run Code Online (Sandbox Code Playgroud)
我期待
bcdd
aabc
Run Code Online (Sandbox Code Playgroud)
第一个memcpy它有效,但第二个在我看来它不是不一致的,所以我做错了。
我不明白我做错了什么。为什么会失败。另外,如果我尝试做同样的事情,但对于例如结构数组,这仍然会发生吗?
https://onlinegdb.com/B1OmLVB6D
我不确定为什么 src 变量在运行 memcpyByByte 函数后会打印两次。
int memcpyByByte(void* src, void* dest, size_t len) {
char* srcC = (char*)src;
char* destC = (char*)dest;
for(int i = 0; i< len; i++){
*(destC+i) = *(srcC+i);
}
}
int main()
{
char a[10] = "1234567890";
char b[10] = "6b";
memcpyByByte(&a, &b, sizeof(a));
printf("src: %s\n", a);
printf("dest: %s", b);
return 0;
}
Run Code Online (Sandbox Code Playgroud)