从unsigned char *到unsigned int的memcpy

时间:2017-06-23 23:57:38

标签: c++ memcpy unsigned-integer unsigned-char

我不确定以下C ++代码是做什么的(我已经更换了与点无关的部分):

unsigned char* p = ...;
unsigned int metaNum;
memcpy( &metaNum, p, sizeof( unsigned int ) );
p += sizeof( unsigned int );

for ( unsigned int m = 0; m < metaNum; m++ ) {

...

}

我知道memcpy

  

源和指向的对象的基础类型   目标指针与此函数无关;结果是   数据的二进制副本。

我还不确定metaNum的解释是什么。它是显而易见的还是与实施有关?

1 个答案:

答案 0 :(得分:2)

这不是特定于实现的:private void button9_Click(object sender, EventArgs e) { try { string ConnString = (@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\\temp\\names.accdb;Persist Security Info=False"); using (OleDbConnection Conn = new OleDbConnection(ConnString)) { //Conn.Close();//severl times connection has been open Conn.Open(); DataSet ds = new DataSet(); ds.ReadXml(@"c:\\temp\\my123.xml"); OleDbCommand cmd = new OleDbCommand(); //OleDbCommand cmd1 = new OleDbCommand(); DataTable dtCSV = new DataTable(); dtCSV = ds.Tables[0]; cmd.Connection = Conn; cmd.CommandType = CommandType.Text; //cmd1.Connection = Conn; //cmd1.CommandType = CommandType.Text; //Conn.Open(); for (int row = 0; row <= dtCSV.Rows.Count - 1; row++) { //for (int col = 0; col < dtCSV.Columns.Count - 1; col++) //{ // //cmd.CommandText = ("INSERT INTO tab1 ( field1, field2) VALUES (dtCSV.Rows ,dtCSV.Columns)"); //} cmd.Parameters.Clear(); if (dtCSV.Columns.Count > 1) { cmd.Parameters.Add(dtCSV.Rows[row][0].ToString()); cmd.Parameters.Add(dtCSV.Rows[row][1].ToString()); cmd.CommandText = ("INSERT INTO tab1 ( field1, field2) VALUES (? , ?)"); cmd.ExecuteNonQuery(); } } //Conn.Close(); } } catch (Exception ex) { richTextBox1.Text = richTextBox1.Text + "\n Error " + ex + "\n"; ; } } 被解释为metaNum个字节的序列,sizeof(unsigned int)指向的相同字节数的内容被复制到其中。< / p>

这里唯一有用的是endianness:复制到p的相同字节序列将根据硬件存储多字节值的方式进行不同的解释,例如{{1} }。如果序列来自相同的硬件,则解释将是相同的。否则,您需要使用ntoh/hton函数将字节序列按顺序排列。