¿Cómo calcular campos de longitud variable?

Algunas partes de bitcoin tx Ex: Script son de longitud variable var_int . ¿Alguien puede explicar cómo calcular su valor a partir de esa tabla var_int ?

Ej: En el tx a continuación, la parte en negrita tiene la longitud del guión. se supone que su longitud es de 349 bytes. Cuando convierto fd5d01directamente a decimal, su valor es 16604417. Creo que no entendí correctamente la tabla var_int .

01000000013dcd7d87904c9cb7f4b79f36b5a03f96e2e729284c09856238d5353e1182b00200000000 fd5d01004730440220762ce7bca626942975bfd5b130ed3470b9f538eb2ac120c2043b445709369628022051d73c80328b543f744aa64b7e9ebefa7ade3e5c716eab4a09b408d2c307ccd701483045022100abf740b58d79cab000f8b0d328c2fff7eb88933971d1b63f8b99e89ca3f2dae602203354770db3cc2623349c87dea7a50cee1f78753141a5052b2d58aeb592bcf50f014cc9524104a882d414e478039cd5b52a92ffb13dd5e6bd4515497439dffd691a0f12af9575fa349b5694ed3155b136f09e63975a1700c9f4d4df849323dac06cf3bd6458cd41046ce31db9bdd543e72fe3039a1f1c047dab87037c36a669ff90e28da1848f640de68c2fe913d363a51154a0c62d7adea1b822d05035077418267b1a1379790187410411ffd36c70776538d079fbae117dc38effafb33304af83ce4894589747aee1ef992f63280567f52f5ba870678b4ab4ff6c8ea600bd217870a8b4f1f09f3a8e8353aeffffffff0130d90000000000001976a914569076ba39fc4ff6a2291d9ea9196d8c08f9c7ab88ac00000000

¿Alguien puede explicarme las reglas de esa tabla?

Respuestas (1)

es mucho más fácil, simplemente omita el "fd". Aquí está la explicación de las páginas web de los desarrolladores de bitcoin.

Suponiendo que tiene el valor en una matriz (tx_array) y un puntero en la matriz (tx_array_ptr), aquí hay un ejemplo de código (script de shell unixoide):

# var_int is defined as:
# value         size Format
# < 0xfd        1    uint8_t
# <= 0xffff     3    0xfd + uint16_t
# <= 0xffffffff 5    0xfe + uint32_t
# -             9    0xff + uint64_t 
# if value <= 0xfd, Bytes  = 1
# if value =  0xfd, Bytes  = 2
# if value =  0xfe, Bytes  = 4
# if value =  0xff, Bytes  = 8
  var_int=${tx_array[$tx_array_ptr]}
  if [ "$var_int" == "FD" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=2
    var_int=$( get_TX_section )
  elif [ "$var_int" == "FE" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=4
    var_int=$( get_TX_section )
  elif [ "$var_int" == "FF" ] ; then
    tx_array_ptr=$(( $tx_array_ptr + 1 ))
    tx_array_bytes=8
  else
    var_int=${tx_array[$tx_array_ptr]}
  fi

Cuando tenga su var_int, ¡no olvide invertir los valores hexadecimales (conversión big endian)! Luego, puede enviar el valor, por ejemplo, a su convertidor decimal, por lo que para su valor (fd5d01) obtiene:

  1. omitir el "fd"
  2. toma los siguientes dos bytes "5d01"
  3. conversión big-endian "015d"
  4. convertir a decimal:

uso de "bc" para convertir valor a decimal:

$ echo "ibase=16;015D" | bc
349