Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
c指针和javascript_Javascript_C_Arrays_Pointers - Fatal编程技术网

c指针和javascript

c指针和javascript,javascript,c,arrays,pointers,Javascript,C,Arrays,Pointers,我一直在致力于C代码到javascript的转换。但它们只是不返回相同的数据 我知道如何处理指针。在javascript中,我将创建一个数组 注意:这不是完整的代码,只是部分代码 来源: // file.h unsigned char m_aucState0[256]; unsigned char m_aucState[256]; unsigned char m_ucI; unsigned char m_ucJ; unsigned char* m_pucState1; unsigned

我一直在致力于C代码到javascript的转换。但它们只是不返回相同的数据

我知道如何处理指针。在javascript中,我将创建一个数组

注意:这不是完整的代码,只是部分代码

来源:

// file.h
unsigned char m_aucState0[256]; 
unsigned char m_aucState[256]; 
unsigned char m_ucI; 
unsigned char m_ucJ; 
unsigned char* m_pucState1; 
unsigned char* m_pucState2;

// file.c
unsigned char *pucKeyData

for(i=0; i<256; i++)   
{   
    m_pucState1 = m_aucState0 + i;   
    m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI);   
    m_pucState2 = m_aucState0 + m_ucJ;   
    //Swaping   
    m_ucTemp = *m_pucState1;   
    *m_pucState1 = *m_pucState2;   
    *m_pucState2 = m_ucTemp;   
    m_ucI = (m_ucI + 1) % iKeyLen;   
}   
memcpy(m_aucState, m_aucState0, 256); 

在Javascript中,有类型化的缓冲区对象:

您还会发现一些关于ctypes集合的信息,但据我所知,它们仅用于本机OS库调用

另外,我不知道像你提到的本地JS缓冲区对象。NodeJS中有一个,但我不知道它的特性

如果您坚持一个接一个地翻译代码,那么这些类型化缓冲区对象可能会极大地支持您。我认为这不是一个好方法,因为当从C翻译到Javascript时,您的术语会发生变化。它从添加长指针值变为形成数组索引

以下是您的翻译中的一个问题示例:

用C写:

m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI);   
this.m_ucJ += this.m_pucState1[0] + (pucKeyData[0] + this.m_ucI);
在Javascript中,您可以编写:

m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI);   
this.m_ucJ += this.m_pucState1[0] + (pucKeyData[0] + this.m_ucI);
C术语中的括号表示改变地址。因此,在Javascript中,这应该放在方括号中,某种程度上如下所示:

this.m_ucJ += this.m_pucState1[0] + pucKeyData[0 + this.m_ucI];
然后你可以跳过“0+”。这说明在不同的语言之间一个接一个的翻译充满了陷阱

因此,假设我们将使用最简单的Javascript对象,即数组
[]
。那么这就是我的建议。这是一份草稿,但它应该给你一个彻底的想法:

// Define arrays
var aState0 = []; // m_aucState0
var aState = []; // m_aucState

// Define helpers
var state1Index; // *m_pucState1
var state2Index; // *m_pucState2 
var i; // m_uci. There is no such thing as "uc" in Javascript.
var j; // m_ucj 
var iLoop; // i in loop.

// It's readable to have this constant.
var bufferLength = 255;

// Somewhere we need:
var keyData;
var temp;
var iKeyLen;


// Just for here, give the array a size. So it's done in Javascript. 
// Alternatively, fill it with 256 values from anywhere.
aState0[bufferLength] = 0;
// console.log(state0.length) will now print 256

// ...
// init i, j, iKeyLen ... 
// ...


for (iLoop = 0; iLoop <= bufferLength; iLoop++) {

    // This:
    // m_pucState1 = m_aucState0 + i;   
    // m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI); 
    // becomes:
    state1Index = iLoop;
    j += aState0[state1Index] + keyData[i]; 

    // This: 
    // m_pucState2 = m_aucState0 + m_ucJ; 
    // becomes:
    state2Index = j;

    // This:
    // m_ucTemp = *m_pucState1;   
    // *m_pucState1 = *m_pucState2;   
    // *m_pucState2 = m_ucTemp;  
    // becomes:
    temp = aState0[state1Index];
    aState0[state1Index] = aState0[state2Index];
    aState0[state2Index] = temp;

    // This:
    // m_ucI = (m_ucI + 1) % iKeyLen; 
    // becomes:
    i = (i+1) % iKeyLen;    

}

// this:
// memcpy(m_aucState, m_aucState0, 256); 
// would be a clone. So you'd need jQuery or else. But you can simply write:
for (index in state0) {
    state[index] = state0[index];
}
//定义数组
var aState0=[];//m_0
var aState=[];//穆奥克州
//定义助手
var state1Index;//*m_pucState1
var state2Index;//*m_pucState2
变量i;//缪西。Javascript中没有“uc”这样的东西。
var j;//穆鲁基
var iLoop;//我喜欢循环。
//有这个常数是可读的。
var bufferLength=255;
//我们需要的地方:
var关键数据;
无功温度;
var iKeyLen;
//就在这里,给数组一个大小。所以它是用Javascript完成的。
//或者,从任意位置用256个值填充它。
aState0[bufferLength]=0;
//log(state0.length)现在将打印256
// ...
//初始i,j,iKeyLen。。。
// ...

对于(iLoop=0;iLoop@chris这些只是部分代码。不是全部。只是相关的。C中的Java数组在技术上应该是一个缓冲区**。所有东西都是引用,包括数组。因此,我们有一个指向数组对象的指针,指向其他引用。使用std::array或std::vector,而不是原始数组。你真的应该这样想关于这里的整体情况,不要一行一行地转换所有内容,这会容易得多。@Ben我实际上在使用javascript和c。是的,我也在尝试。但一般来说,我需要了解指针在这里是如何工作的。因为我对它不是很在行。当你使用它时,pucKeyData似乎不太熟悉。@Ben Its th谢谢。我现在就试试这个。无论如何,这是一个服务器。我在使用NoDE.js:)我实际上得到了C++代码。它很短,但是我也遇到了一个问题。
函数。你能检查一下吗?我想这是唯一一个没有问题的。我在问题的末尾补充了一些说明。你能检查一下吗?1)
m\u pucState1=m\u aucState+m\u ucI和2)
m_ucJ+=*m_pucState1是:在1)中,您有一个名为
m_aucState
的指针,并向该指针添加一个名为
m_ucI
的偏移量。所以你创建了一个新地址。然后让
m_pucState1
指向该地址。在2)中,您获取地址
m_pucState1
,并用星号
*
解除对它的引用。使用星号,您可以获得存储在内存单元中的值,该值由
m_pucState1
寻址。然后将该值添加到
m_ucJ
。简而言之,RAND()在本文中的作用是什么,代码出了什么问题?我有太多的猜测和假设。
this.m_ucJ += this.m_pucState1[0] + pucKeyData[0 + this.m_ucI];
// Define arrays
var aState0 = []; // m_aucState0
var aState = []; // m_aucState

// Define helpers
var state1Index; // *m_pucState1
var state2Index; // *m_pucState2 
var i; // m_uci. There is no such thing as "uc" in Javascript.
var j; // m_ucj 
var iLoop; // i in loop.

// It's readable to have this constant.
var bufferLength = 255;

// Somewhere we need:
var keyData;
var temp;
var iKeyLen;


// Just for here, give the array a size. So it's done in Javascript. 
// Alternatively, fill it with 256 values from anywhere.
aState0[bufferLength] = 0;
// console.log(state0.length) will now print 256

// ...
// init i, j, iKeyLen ... 
// ...


for (iLoop = 0; iLoop <= bufferLength; iLoop++) {

    // This:
    // m_pucState1 = m_aucState0 + i;   
    // m_ucJ += *m_pucState1 + *(pucKeyData+m_ucI); 
    // becomes:
    state1Index = iLoop;
    j += aState0[state1Index] + keyData[i]; 

    // This: 
    // m_pucState2 = m_aucState0 + m_ucJ; 
    // becomes:
    state2Index = j;

    // This:
    // m_ucTemp = *m_pucState1;   
    // *m_pucState1 = *m_pucState2;   
    // *m_pucState2 = m_ucTemp;  
    // becomes:
    temp = aState0[state1Index];
    aState0[state1Index] = aState0[state2Index];
    aState0[state2Index] = temp;

    // This:
    // m_ucI = (m_ucI + 1) % iKeyLen; 
    // becomes:
    i = (i+1) % iKeyLen;    

}

// this:
// memcpy(m_aucState, m_aucState0, 256); 
// would be a clone. So you'd need jQuery or else. But you can simply write:
for (index in state0) {
    state[index] = state0[index];
}