Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript能否获得与C语言memcpy函数相同的结果_Javascript_C - Fatal编程技术网

Javascript能否获得与C语言memcpy函数相同的结果

Javascript能否获得与C语言memcpy函数相同的结果,javascript,c,Javascript,C,Javascript能否获得与C语言memcpy函数相同的结果,请参见下面的代码: uint32_t value; memcpy(&value, "00", 8); printf('%d',val);//result is 12336 Javascript可以打印相同的结果吗? 函数stringToBuffer(字符串){ 返回新的UINT32阵列( string.split(“”).map(c=>c.charCodeAt(0)) ); } 控制台日志(stringToBuffer(“

Javascript能否获得与C语言
memcpy
函数相同的结果,请参见下面的代码:

uint32_t value;
memcpy(&value, "00", 8);
printf('%d',val);//result is 12336
Javascript可以打印相同的结果吗?

函数stringToBuffer(字符串){
返回新的UINT32阵列(
string.split(“”).map(c=>c.charCodeAt(0))
);
}

控制台日志(stringToBuffer(“00”))首先,C代码不正确,正如您所希望的那样。%d需要在其周围加双引号,否则它将转换为整数值(至少在linux上使用gcc时是这样)。其次,C代码给出了未定义的行为,因为ASCII字符串的宽度(可能)为2个字节,并且您正在从该位置复制8个字节。另外,您正在将4个额外字节复制到
值的位置。这将提供6个额外的读取字节和4个额外的写入字节。它可能不会给出分段错误,因为该值存储在堆栈上,但从内存中读取的值将依赖于编译器(可能还依赖于运行)。此外,您无法确定您正在覆盖的其他4个字节是什么,以及这在以后是否重要(如果您有更多的代码)。

我认为C代码甚至不会编译,即使它编译了,也可能会立即崩溃。您是否只是试图构造一个整数,其中低位与两个
'0'
字符中的字节相同?将3个字节的字符串中的8个字节复制到x86上仅包含4个字节的目标中…哎哟。此外,如果不清楚:12336十进制是0x3030十六进制,零字符在ASCII和子代编码(包括UTF-8)中编码为0x30。因此,字符串
“00”
中的两个字符将被编码为ASCII格式的
30 30
,将
30 300 00
读入一个小的尾数32位整数将得到值0x00003030,即十进制12336。C字符串
“00”
被编码为字节
30 00??
,如果字节
??
未定义,任何读取它的尝试,或超出它的任何字节,都会产生未定义的行为:它可能会做一些合理的事情,可能会崩溃,或者可能会导致程序的其他部分以奇怪或不可预测的方式运行。嗨,Daniel Pryden,javascript有什么方法可以转换“00”吗直接发送到0x3030,感谢这将使您获得一个包含
uint8
值的数组,而不是单个
uint32
const-stringToUint32=string=>new-uint32数组(new-uint32数组)(new-Uint8Array(string.padEnd(string.length+(4-string.length%4)%4'\x00').split('.map)(c=>c.charCodeAt(0))).buffer)[0]