Le contenu d'un Byte Array de taille 4 est le suivant:
{1, 0, 0, 0} . Cela se traduit par le nombre entier 1 en C # lors de l'utilisation de BitConverter.ToInt32 (bytearray, 0);
Cependant, lors de la conversion de ce tableau d'octets en un Integer dans Kotlin en utilisant la base de code suivante, j'obtiens la valeur 16777216 au lieu de la valeur de 1.
fun toInt32(bytes: ByteArray, index: Int): Int
{
if (bytes.size != 4)
throw Exception("The length of the byte array must be at least 4 bytes long.")
return 0xff
and bytes[index].toInt() shl 56
or (0xff and bytes[index + 1].toInt() shl 48)
or (0xff and bytes[index + 2].toInt() shl 40)
or (0xff and bytes[index + 3].toInt() shl 32)
}
ou
var test0 = BigInteger(bytearray).toInt() = 16777216 var test1 = BigInteger(bytearray).toFloat() = 1.6777216
Je pense que les deux méthodes de conversion sont correctes et que les valeurs d'octets ne sont pas signées.
3 Réponses :
En C #, vous avez la classe suivante:
var test0 = BitConverter.ToInt32 (bytearray, 0)
Comme suggéré par @Lother et itsme86.
fun littleEndianConversion(bytes: ByteArray): Int {
var result = 0
for (i in bytes.indices) {
result = result or (bytes[i].toInt() shl 8 * i)
}
return result
}
Comment puis-je effectuer la même conversion avec bigEndian?
Une toute autre solution qui, à mon avis, est un peu plus efficace:
private fun byteToInt(bytes: ByteArray): Int {
var result = 0
var shift = 0
for (byte in bytes) {
result = result or (byte.toInt() shl shift)
shift += 8
}
return result
}
Java fonctionne avec "l'ordre des octets du réseau" qui est big endian, tandis que C # semble fonctionner avec little endian.
@Lothar Endianness est une caractéristique matérielle et non logicielle. Un C # sur une machine big endian fonctionnera avec big endian.
@ itsme86 La machine virtuelle Java est essentiellement une simulation matérielle, il n'y a donc pas de contradiction ici.
@Lothar Votre déclaration selon laquelle C # fonctionne avec little endian est trompeuse, voire fausse.
@ itsme86 Bien que je pense avoir suffisamment expliqué l'effet, vous pouvez reformuler ce que j'ai écrit et en faire une réponse.
Pour être plus précis,
BigInteger (byte [])suppose l'ordre des octets big-endian, tandis queBitConverter.ToInt32utilise l'endianness du matériel sous-jacent.En C #, vous devriez vraiment utiliser BitConvert.IsLittleEndian pour déterminer si et comment vous devez interpréter vos données sources. Cela permettra à votre code de fonctionner correctement sur l'une ou l'autre architecture.