Los mismos bytes muestran un resultado diferente [duplicado]
Frecuentes
Visto 123 veces
0
Sin cambiar byte[] numArray, ambos cuadros de mensaje muestran una salida diferente aunque los bytes permanezcan exactamente iguales. Estoy confundido.
Resultado del primer cuadro de mensaje: stream:stream to="" version="1.0" xmlns:stream="http://etherx.jabber.org/streams">
Resultado del segundo MessageBox: ���F^��v
Tercer cuadro de mensaje: "Coincidencia"
MessageBox.Show(System.Text.Encoding.UTF8.GetString(numArray));
byte[] num1 = numArray;
byte[] encrypted = getEncryptedInit(numArray);
MessageBox.Show(System.Text.Encoding.UTF8.GetString(numArray));
byte[] num2 = numArray;
if (num1.SequenceEqual<byte>(num2) == true)
{
MessageBox.Show("Match");
}
1 Respuestas
6
getEncryptedInit
debe estar modificando el contenido de numArray
.
Como num1
y num2
ambos apuntan a numArray
, por supuesto que serían equivalentes.
Recuerde, las matrices son tipos de referencia, por lo que cuando dice num1 = numArray
, solo estás señalando el num1
variable a la misma ubicación en la memoria que numArray
puntos a. Si realmente quieres capturar lo que numArray
parece en un momento específico, tendría que hacer una copia, en lugar de simplemente hacer una tarea simple.
Considere el siguiente ejemplo:
void DoStuff(byte[] bytes) {
for (int i = 0; i < bytes.Length; i++) {
bytes[i] = 42;
}
}
bool Main() {
// This allocates some space in memory, and stores 1,2,3,4 there.
byte[] numArray = new byte[] { 1, 2, 3, 4 };
// This points to the same space in memory allocated above.
byte[] num1 = numArray;
// This modifies what is stored in the memory allocated above.
DoStuff(numArray);
// This points to the same space in memory allocated above.
byte[] num2 = numArray;
return (num1 == num2 == numArray); // always true
}
Respondido el 03 de diciembre de 13 a las 14:12
pero tanto el segundo MessageBox como num2 apuntan a numArray después de llamar a getEncryptedInit. Entonces, ¿cómo puede uno señalar la versión modificada y el otro no? - user2880751
No, todos apuntan al mismo lugar, es la misma ubicación en la memoria. getEncryptedInit
es simplemente modificar lo que está almacenado en esa memoria. - RobSiklos
@user2880751: Para ver las cosas más claramente aquí, reemplace numArray
con (byte[])numArray.Clone()
en tus tareas. - OR Mapper
@ user2880751 Entre su primer y segundo cuadro de mensaje modificó numArray, por lo tanto, la salida es diferente. El tercer cuadro de mensaje compara dos referencias que hacen referencia a la misma matriz. Independientemente de su contenido, esa comparación será cierta. Cuando asigna byte[] num1 = numArray, no copia la matriz, solo crea un nuevo nombre para ella. - Alan
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c# .net byte or haz tu propia pregunta.
@CodeCaster: No es un duplicado. Si bien la información de la otra pregunta es definitivamente relevante para la solución, o incluso para la depuración a fin de encontrar una solución, las preguntas son bastante diferentes, como lo demuestran las respuestas correctas. Compare las respuestas correctas (abreviadas) con la otra pregunta ("La referencia se pasa por valor") y con esta pregunta ("
getEncryptedInit
debe estar modificando el contenido denumArray
."), que de ninguna manera son intercambiables. - O. R. Mapper@ORMapper No me importa que el pregunta no es un duplicado exacto (no hay duda en esta pregunta de todos modos). Mi punto es: esta pregunta es respondida en esa pregunta y sus respuestas: la referencia de la matriz se pasa por valor a
getEncryptedInit()
, por lo que la matriz modificada allí es la misma matriz quenumArray
puntos a. La respuesta de Marc allí indica esto: "Esa referencia se pasa por valor, lo que significa que la persona que llama verá los cambios en el contenido de la matriz". La alternativa hubiera sido un voto cerrado por no entender, creo que lo que hice fue más constructivo. - CodeCasterTambién tenga en cuenta que un solo voto cerrado duplicado no daña una pregunta, solo se cierra después de cuatro votos más. Un comentario se inserta automáticamente con un enlace al posible duplicado, en el que OP puede hacer clic y aprender. Si OP no entiende o no está de acuerdo con el posible duplicado, él o ella pueden actualizar la pregunta o agregar un comentario para explicar las partes que no entienden (y elijo mis duplicados con cuidado y retiro el voto si OP demuestra que estoy equivocado). Por otro lado, el posible duplicado podría proporcionarle a OP la información necesaria para resolver el problema en cuestión. - CodeCaster
@CodeCaster: Como señalé, la respuesta a esta pregunta es que
numArray
debe modificarse dentrogetEncryptedInit
(porque es la única pieza de código que no estamos viendo). El hecho de que el método de depuración utilizado por el OP no arrojó la información deseada estaba relacionado con las variables de matriz que son referencias, como se explica en la otra pregunta y sus respuestas, definitivamente es útil, pero no está necesariamente relacionado con el problema original. Con base en la información que tenemos,getEncryptedInit
también podría modificarnumArray
como un efecto secundario, no a través de la referencia pasada. - O. R. Mapper@CodeCaster: Por supuesto, un solo voto cercano no cierra la pregunta. Simplemente significa que se ha presentado una posible razón para cerrar la pregunta, y es el momento adecuado para emitir posibles contraargumentos a la votación cerrada, que es lo que he hecho, antes otros usuarios que podrían no pensar en esos argumentos en contra emiten votos cercanos adicionales y, por lo tanto, terminan cerrando la pregunta. - O. R. Mapper