elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


  Mostrar Temas
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18
121  Programación / Programación C/C++ / Restas manuales en "Binario" en: 1 Mayo 2016, 15:16 pm
Muy buen dia compañeros.

Ayer publique el tema Números de longitud variable en C (Numeros muy grandes)

Donde transformo strings de numeros a su representación en "binario"  en memoria. Ya hago sumas y multiplicaciones en forma de sumas multiples.
Necesito hacer ahora restas tengo mis dudas se que es una tonteria pero estoy hecho un lio.

Las sumas a nivel de "byte" las hago asi:

Código
  1. unsigned char resultado[3];
  2. unsigned char acarreo;
  3. unsigned char a;
  4. unsigned char b;
  5. unsigned short c;
  6. a = 0xFF;
  7. b = 0x01;
  8. c = a + b;
  9. //ahora c vale 0x0101
  10. resultado[0] = c;
  11. acarreo = c >> 8;
  12. //el acarreo se le suma al siguiente ciclo de bytes

Asi puedo meter ese seudo codigo en un ciclo de N bytes y poder trabajar con numetro positivos de cualquier longitud

Ahora el detalle que necesito usar la operacion modulo y para ello necesito hacer diviciones y por lo tante necesito restas.

Mi duda es hacer las restas mas o menos igual

Código
  1. #include<stdio.h>
  2.  
  3. int main() {
  4. unsigned char a;
  5. unsigned char b;
  6. unsigned short c;
  7. a = 0xFF;
  8. b = 0x01;
  9. c = a - b;
  10. }


Obvio tendré que tener forma de capturar los números negativos, y si es negativo ¿Que hay que hacer? ¿es como si fuera el acarreo en la suma?

intente hacer las restas en el cuaderno en binario y me dormi en el intento eso fue hace unas 5 horas.
122  Programación / Programación C/C++ / Números de longitud variable en C (Numeros muy grandes) en: 30 Abril 2016, 20:40 pm

Y si bien deben de existir varias librerías que ya lo implementen a su manera no me quería quedar sin implementar mi propia solución.

El programa ahora solo convierte cadenas de números decimales "1234" en su representación binaria en memoria, pero no se engañen esta no es la función strtol, esta puede almacenar numeros (sin signo por el momento) de cualquier longitud siempre y cuando tengamos memoria suficiente.

Vamos a ver un ejemplo de las siguientes cadenas:
"1"
"50"
"200"
"255"
"65535"
"4294967295"
"18446744073709551615"

Código
  1. int main() {
  2. numero *n;
  3. n = valor("1"); //Ejemplo de 1 solo digito
  4. free_numero(n);
  5. n = valor("50"); //Ejemplo de 2 digitos
  6. free_numero(n);
  7. n = valor("200"); //Ejemplo de 3 digitos
  8. free_numero(n);
  9. n = valor("255"); //Maximo numero de 1 byte
  10. free_numero(n);
  11. n = valor("65535"); //Maximo numero de 2 bytes
  12. free_numero(n);
  13. n = valor("4294967295"); //Maximo numero de 4 bytes
  14. free_numero(n);
  15. n = valor("18446744073709551615"); //Maximo numero de 8 bytes
  16. free_numero(n);
  17. }

Salida (Con un poco de depuración)
Código:
procesando numero 1
1 x10^0 : numeros[0]->valor: 0x456b30 01
b->valor: 0x456bb0 01
procesando numero 50
5 x10^1 : numeros[0]->valor: 0x451480 32
0 x10^0 : numeros[1]->valor: 0x451470 00
b->valor: 0x451530 32
procesando numero 200
2 x10^2 : numeros[0]->valor: 0x451470 c8
0 x10^1 : numeros[1]->valor: 0x4514f0 00
0 x10^0 : numeros[2]->valor: 0x4514b0 00
b->valor: 0x451500 c8
procesando numero 255
2 x10^2 : numeros[0]->valor: 0x451550 c8
5 x10^1 : numeros[1]->valor: 0x451420 32
5 x10^0 : numeros[2]->valor: 0x451530 05
b->valor: 0x451420 ff
procesando numero 65535
6 x10^4 : numeros[0]->valor: 0x451410 60ea
5 x10^3 : numeros[1]->valor: 0x451510 8813
5 x10^2 : numeros[2]->valor: 0x4514a0 f401
3 x10^1 : numeros[3]->valor: 0x451530 1e
5 x10^0 : numeros[4]->valor: 0x4513e0 05
b->valor: 0x451420 ffff
procesando numero 4294967295
4 x10^9 : numeros[0]->valor: 0x4514f0 00286bee
2 x10^8 : numeros[1]->valor: 0x4514a0 00c2eb0b
9 x10^7 : numeros[2]->valor: 0x4514b0 804a5d05
4 x10^6 : numeros[3]->valor: 0x457210 00093d
9 x10^5 : numeros[4]->valor: 0x4571a0 a0bb0d
6 x10^4 : numeros[5]->valor: 0x457160 60ea
7 x10^3 : numeros[6]->valor: 0x457380 581b
2 x10^2 : numeros[7]->valor: 0x456ff0 c8
9 x10^1 : numeros[8]->valor: 0x457230 5a
5 x10^0 : numeros[9]->valor: 0x4572e0 05
b->valor: 0x457210 ffffffff
procesando numero 18446744073709551615
1 x10^19 : numeros[0]->valor: 0x457180 0000e8890423c78a
8 x10^18 : numeros[1]->valor: 0x4572e0 0000203b9db5056f
4 x10^17 : numeros[2]->valor: 0x457370 00002876e1158d05
4 x10^16 : numeros[3]->valor: 0x457390 000004bfc91b8e
6 x10^15 : numeros[4]->valor: 0x457360 0000a7dcf75015
7 x10^14 : numeros[5]->valor: 0x456ff0 00c05773a57c02
4 x10^13 : numeros[6]->valor: 0x457060 0080ca396124
4 x10^12 : numeros[7]->valor: 0x457000 00409452a303
0 x10^11 : numeros[8]->valor: 0x457080 00
7 x10^10 : numeros[9]->valor: 0x457290 003c534c10
3 x10^9 : numeros[10]->valor: 0x457330 005ed0b2
7 x10^8 : numeros[11]->valor: 0x4571a0 0027b929
0 x10^7 : numeros[12]->valor: 0x4571e0 00
9 x10^6 : numeros[13]->valor: 0x457200 405489
5 x10^5 : numeros[14]->valor: 0x4570d0 20a107
5 x10^4 : numeros[15]->valor: 0x457250 50c3
1 x10^3 : numeros[16]->valor: 0x4572a0 e803
6 x10^2 : numeros[17]->valor: 0x457240 5802
1 x10^1 : numeros[18]->valor: 0x457130 0a
5 x10^0 : numeros[19]->valor: 0x457150 05
b->valor: 0x457840 ffffffffffffffff

Ahora esos son ejemplo que las funciones estándar existentes pueden manejar correctamente

Ahora bien el siguiente numero
Código:
98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210
Código
  1. int main() {
  2. numero *n;
  3. n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol???
  4. free_numero(n);
  5. }

Salida sin tanta depuración:
Código:

procesando numero 98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210
b->valor: 0x777b70 ea7ec651d7671ed5de67409bdc172dc9a9d7bbd8302306b3a2e2a0cf7730b39b359cea778e3d200b9b9fb6770c6b95b395e8ab9f1474014c01ce7a3e870aa632c1ce5b705dc9f0a328d297dc436038565411ca0e338c7db56f94881768b143402be103d352ddf1beb8d5d3f59c88bb500306744fbfea44dca84d3c2cca5a88060c7168dfa57b5f86a57dda5ad3d0957639100089ca6ac40c6fbc516e76821e8026d3fce0d3fa4b1a5c5b42f723c67c3801e5b6146b5c44a3c70c7b7f63634f14211881cf4fca1bd9f7d9b8bda6db831e0a06f25384fd4262826ba6498c9ec27623314c5d7222d86a9cdf905544e7d67a056bb74b830615b2a164ba237a3889fd302bd8e092456865c265c8202d61ff55a442dc22547e68935d270fa33825e4cd331378afe199ae4ab2acea2aca6330f4727f244b72569ba75bab5a53ce22e2472f603d57314b8b02b361931bcef98c0911032db9e418e9288359f38c1fdfbe7f6a4d2fed867f76fd66d82cd107278f5ae8ec0033a226a31d2e2415f9eb72e910bfad8c2d7c02e8d44c2689de3587e51162308a50fbb776d016ea5491929011176ec8401dbed59282af7910675df3810d704db4faca2e8b44ab92d06237e872c0deef48718f59edd1541f5366e49dcabd9a00c64ec1c99f23be503b0a559e545702185426b2d94b5d7dac547ae430ebac390487d3d80b8b7b7d7d1cd2a40688f96c286cb522671faa5f272e4dd858d3f6bcbdb10fa70bebbef59aa82c18fdfd622c4b7e215c315373e366e84e0a
el numero necesita 557 bytes


Falta optimizar las funciones, el proceso de multiplicación lo hace mediante sumas continuas, trate de liberar la memoria con forme se va usando para no olvidar ninguna variable pero se me pudo pasar alguna.

Usos que se le pueden dar al programa
Si necesitas algo especializado y almacenar números extremadamente grandes para su posterior uso esta es una buena forma de hacerlo.
Yo en lo personal trabaje con esta aplicación por que necesito una forma de almacenar números de mas de 4096 bits tengan encuenta que en el ejemplo anterior el numero mas grande fue un numero de 557 bytes que son 4456 bits.
El proceso mas tardado es convertir el numero de string a binario. Posteriormente considero que las sumas son algo eficientes cuando los números ya se encuentran en su representación binaria.

Codigo completo:

Código
  1. /*
  2. Twitter @albertobsd
  3. */
  4.  
  5. #include<stdio.h>
  6. #include<stdlib.h>
  7. #include<string.h>
  8. #include<stdarg.h>
  9.  
  10. typedef unsigned char byte;
  11.  
  12. typedef struct numero_struct {
  13. byte *valor;
  14. unsigned int bytes;
  15. }numero;
  16.  
  17. numero *valorBase10(unsigned char n,unsigned char e);
  18. numero *valor(char *n);
  19. unsigned short add(unsigned char a, unsigned char b);
  20. void debug(char*s,unsigned char *ptr,unsigned int l,...);
  21. numero *add_numero(numero *a,numero *b);
  22. numero *copiar(numero* n);
  23.  
  24. numero *add_numero(numero *a,numero *b) {
  25. numero *c;
  26. unsigned char flag_a = 1,flag_b = 1,valor_a,valor_b,acarreo;
  27. unsigned short valor_c;
  28. unsigned int i = 0,max,entrar =1;
  29. //printf("add_numero\n");
  30. //debug("a->valor",a->valor,a->bytes);
  31. //debug("b->valor",b->valor,b->bytes);
  32. c = calloc(sizeof(numero),1);
  33. max = a->bytes + b->bytes;
  34. c->valor = calloc(max,1);
  35. //printf("while\n");
  36. while(entrar) {
  37. valor_c = 0;
  38. //printf("valor de i: %u\n",i);
  39. //printf("valor de a->bytes: %u\n",a->bytes);
  40. if(i < a->bytes) {
  41. valor_a = a->valor[i];
  42. }
  43. else {
  44. flag_a = 0;
  45. valor_a = 0;
  46. }
  47. //printf("valor de b->bytes: %u\n",b->bytes);
  48. if(i < b->bytes) {
  49. valor_b = b->valor[i];
  50. }
  51. else {
  52. flag_b = 0;
  53. valor_b = 0;
  54. }
  55. if(flag_a || flag_b) {
  56. if(c->valor[i] != 0) {
  57. //printf("valor de c->valor[%i]: 0x%.2x\n",i,c->valor[i]);
  58. valor_c+=c->valor[i];
  59. c->valor[i] = 0;
  60. }
  61. //printf("valor de valor_a: 0x%.2x\n",valor_a);
  62. //printf("valor de valor_b: 0x%.2x\n",valor_b);
  63. valor_c+= add(valor_a,valor_b);
  64. //printf("valor de valor_c: 0x%.4x\n",valor_c);
  65. c->valor[i] = valor_c;
  66. acarreo = valor_c >> 8;
  67. i++;
  68. if(acarreo) {
  69. //printf("valor de acarreo: 0x%.2x\n",acarreo);
  70. c->valor[i] = acarreo;
  71. //printf("valor de c->valor[%i]: %.2x\n",i,c->valor[i]);
  72. }
  73. }
  74. else {
  75. entrar = 0;
  76. }
  77. }
  78. //printf("end while\n");
  79. if(acarreo) {
  80. c->bytes = i+1;
  81. }
  82. else {
  83. c->bytes = i;
  84. }
  85. //printf("bytes: %i\n",c->bytes);
  86. //debug("c->valor",c->valor,c->bytes);
  87. //printf("End add_numero\n");
  88. return c;
  89. }
  90.  
  91. void free_numero(numero* t) {
  92. if(t) {
  93. if(t->valor) {
  94. memset(t->valor,0,t->bytes);
  95. free(t->valor);
  96. }
  97. memset(t,0,sizeof(numero));
  98. free(t);
  99. }
  100. }
  101.  
  102. numero *copiar(numero* n) {
  103. numero *t;
  104. t= calloc(sizeof(numero),1);
  105. t->bytes = n->bytes;
  106. t->valor = calloc(t->bytes,1);
  107. memcpy(t->valor,n->valor,t->bytes);
  108. return t;
  109. }
  110.  
  111. void debug(char *s,unsigned char *ptr,unsigned int l,...) {
  112. va_list args;
  113. int i = 0;
  114. char *buffer;
  115. buffer = calloc(strlen(s)*10,sizeof(char));
  116. va_start(args, l);
  117. vsprintf(buffer,s, args);
  118. printf("%s: 0x%x ",buffer,ptr);
  119. while(ptr && i < l) {
  120. printf("%.2x",ptr[i++]);
  121. }
  122. printf("\n");
  123. va_end(args);
  124. free(buffer);
  125. }
  126.  
  127. numero *valorBase10(unsigned char n,unsigned char e) {
  128. int i,j;
  129. numero *a,*b,*t,*zero,**tofree;
  130. a = calloc(sizeof(numero),1);
  131. a->bytes = 1;
  132. a->valor = calloc(a->bytes,1);
  133. a->valor[0] = n;
  134. zero = calloc(sizeof(numero),1);
  135. zero->bytes = 1;
  136. zero->valor = calloc(zero->bytes,1);
  137. zero->valor[0] = 0;
  138. b = zero;
  139. i = 0;
  140. while(i< e) {
  141. j = 0;
  142. tofree = calloc(sizeof(numero*),10);
  143. while(j < 10) {
  144. t = add_numero(a,b);
  145. tofree[j++] = t;
  146. b = t;
  147. }
  148. free_numero(a);
  149. a = copiar(b);
  150. j = 0;
  151. while(j<10) {
  152. free_numero(tofree[j++]);
  153. }
  154. free(tofree);
  155. b = zero;
  156. i++;
  157. }
  158. free_numero(b);
  159. return a;
  160. }
  161.  
  162. numero *valor(char *n) {
  163. numero *zero,*b;
  164. numero **numeros;
  165. char *ptr;
  166. int bytes;
  167. int i,j;
  168. printf("procesando numero %s\n",n);
  169. ptr = n;
  170. bytes = strlen(n);
  171. numeros = calloc(sizeof(numero*),bytes);
  172. i = 0;
  173. while(i < bytes) {
  174. numeros[i] = valorBase10(ptr[i] - '0' , (bytes-1) - i);
  175. //debug("numeros[i]",(unsigned char*)numeros[i],sizeof(numero));
  176. //debug("%c x10^%i : numeros[%i]->valor",(unsigned char*)numeros[i]->valor,numeros[i]->bytes,ptr[i],(bytes-1) - i,i);
  177. i++;
  178. }
  179. zero = calloc(sizeof(numero),1);
  180. zero->bytes = 1;
  181. zero->valor = calloc(zero->bytes,1);
  182. zero->valor[0] = 0;
  183. b = zero;
  184. i = 0;
  185. while(i < bytes) {
  186. b = add_numero(numeros[i],b);
  187. free_numero(numeros[i]);
  188. i++;
  189. }
  190. //debug("b",(unsigned char*)b,sizeof(numero));
  191. debug("b->valor",(unsigned char*)b->valor,b->bytes);
  192. free(zero);
  193. return b;
  194. }
  195. unsigned short add(unsigned char a, unsigned char b) {
  196. return a+b;
  197. }
  198. int main() {
  199. numero *n;
  200. n = valor("1"); //Ejemplo de 1 solo digito
  201. free_numero(n);
  202. n = valor("50"); //Ejemplo de 2 digitos
  203. free_numero(n);
  204. n = valor("200"); //Ejemplo de 3 digitos
  205. free_numero(n);
  206. n = valor("255"); //Maximo numero de 1 byte
  207. free_numero(n);
  208. n = valor("65535"); //Maximo numero de 2 bytes
  209. free_numero(n);
  210. n = valor("4294967295"); //Maximo numero de 4 bytes
  211. free_numero(n);
  212. n = valor("18446744073709551615"); //Maximo numero de 8 bytes
  213. free_numero(n);
  214. n = valor("98765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210987654321098765432109876543210"); //Ejemplo de un Googol???
  215. printf("el numero necesita %i bytes\n",n->bytes);
  216. free_numero(n);
  217. }
123  Programación / .NET (C#, VB.NET, ASP) / Equivalente json_encode en ASP.NET ? en: 28 Abril 2016, 22:43 pm
Estoy buscando una solucion simplo como
Código

pero en ASP.net ya se C# o VB


Solucion

Código
  1. JavaScriptSerializer serie = new JavaScriptSerializer();
  2. lista = serie.Serialize(Objeto);


124  Programación / .NET (C#, VB.NET, ASP) / ¿Donde van las sentencias imports ? en: 28 Abril 2016, 19:51 pm
Código
  1. Imports System.Web
  2. Imports MySql.Data.MySqlClient

Pues eso donde tengo que colocar las sentecias imports dentro del documento aspx?

Estoy usando Visual Studio Express 2015

Saludos.



Solucion

en el archivo defualt.aspx tiene que estar la primera linea debe de decir al como:

Código
  1. <%@ Page Language="vb" AutoEventWireup="false" CodeBehind="default.aspx.vb" Inherits="WebApplication5.WebForm1" %>
Entonces debe exister un archivo llamado defualt.aspx.vb

Ahi tenemos que colocar las sentecias
125  Programación / Desarrollo Web / Problema con ejemplo sencillo en ASP.NET Razor C# en: 27 Abril 2016, 00:27 am
Muy buen dia compañeros, yo realmente prefiero las soluciones en algun otro lenguaje como PHP pero.... me estan pidiendo trabajar en ASP.NET

Me he topado al tratar de ejcutar un codigo sencillo de ejemplo de la siguiente pagina

http://www.w3schools.com/aspnet/razor_syntax.asp

Código
  1. <!-- Single statement block -->
  2. @{ var myMessage = "Hello World"; }
  3.  
  4. <!-- Inline expression or variable -->
  5. <p>The value of myMessage is: @myMessage</p>
  6.  
  7. <!-- Multi-statement block -->
  8. @{
  9. var greeting = "Welcome to our site!";
  10. var weekDay = DateTime.Now.DayOfWeek;
  11. var greetingMessage = greeting + " Here in Huston it is: " + weekDay;
  12. }
  13. <p>The greeting is: @greetingMessage</p>
  14.  

Al momento de cargar en la URL en el navegaor me dice que:

http://localhost/test.cshtml

Código:
Server Error in '/' Application.

This type of page is not served.

Description: The type of page you have requested is not served because it has been explicitly forbidden.  The extension '.cshtml' may be incorrect.   Please review the URL below and make sure that it is spelled correctly.

Requested URL: /test.cshtml

Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.34209


He googleado bastante y no he encontrado solucion al problema.

Tengo el IIS instaldo y el codigo lo pongo desde el block de notas en el directorio correspondiente.
Uso windows 8.1 en este momento.

Tengo bastante sin usar windows aun asi no he encontrado la configuracion correspondiente para ejcutar esos codigos.

Si escribo ejemplo de codigo de ASP clasico si los ejecuta, incluso algunos codgios de .net en VB y C# tambien pero el anterior no lo ejecuta para nada.
126  Programación / Programación C/C++ / Juego de BlackJack en C en: 24 Abril 2016, 15:58 pm
La publicación original la tengo en mi pagina:

http://codigoenc.com/post/33/Juego_de_BlackJack_en_C_paso_a_paso

El juego se puede optimazar si. Se puede perzonalizar si, actualmente juega en automatico.



En este Topic vamos a hacer un juego de blackjack en C, lo vamos a tratar de ser lo mas sencillo posible explicando función por función.


Primero definiremos un Maso de cartas esto es 13 cartas desde el A hasta el K

Código
  1. char *mazo = "A234567890JQK";

Para hacer este juego lo mas escalable posible generaremos dinámicamente un mazo de juego de N bajaras, para eso tenemos la siguiente función:

Código
  1. char *crear_baraja(int n) {
  2. int i = 0,j;
  3. int offset = 0;
  4. char *cartas;
  5. cartas = calloc(sizeof(char)*52+1,n);
  6. while(i < n) {
  7. j = 0;
  8. while(j < 4) {
  9. memcpy(cartas+offset,mazo,13);
  10. offset+=13;
  11. j++;
  12. }
  13. i++;
  14. }
  15. cartas[offset] = '\0'; //Esta instrucción es innecesaria debido a la función calloc pero lo dejamos para aclarar que nuestra condicion de paro es el caracter nulo al final de la cadena
  16. return cartas;
  17. }

La funcion anterior solo nos devuelve un puntero con la memoria asignada mediante Malloc con la cantidad de bajaras que le pedimos.

Ahora si mandamos a llamar esta funcion y mostramos la cadena veremos un mazo ordenado obvio por la forma que se construyo
 En este ejemplo usaremos 2 barajas pero tengan en cuenta que puede ser hasta 1000 barajas siempre y cuando este disponible
Código
  1. baraja = crear_baraja(2);
  2. printf("Baraja:\n%s\n",baraja);
salida:
Código:
Baraja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK

Ahora si bien tenemos que barajar la bajara.

Código
  1. char *barajar(char *baraja) {
  2. int len = strlen(baraja);
  3. char *temp = calloc(len+1,1);
  4. int r;
  5. int i = 0;
  6. /*
  7. Poner su propia funcion random disponible en su sistema
  8. En freeBSD prefiero usar arc4rand
  9. */
  10. while(i < len) {
  11. r = arc4random_uniform(len);
  12. if(baraja[r] != 0) {
  13. temp[i] = baraja[r];
  14. baraja[r] = 0;
  15. i++;
  16. }
  17. }
  18. free(baraja);
  19. return temp;
  20. }

Esta función nos devuelve un nuevo puntero con la bajara anterior pero ahora en desorden

Mostramos la salida:
Código
  1. baraja = barajar(baraja);
  2. printf("Baraja:\n%s\n",baraja);
Código:
Baraja:
9KJ4067Q6A9068Q5A08J3Q3QJ7Q3AK38A6J453762KK0852KA4Q52548753Q234A42K2Q3J7KJ090A62A5J0674KJ702689799989584

Depues de construir las funcoines de evaluar carta y evaluar jugador podemos terminar el juego
Código
  1. /*
  2. Twitter @albertobsd
  3.  */
  4. #include<stdio.h>
  5. #include<stdlib.h>
  6. #include<string.h>
  7. /*
  8. Maso basico de Cartas para su salida en pantalla.
  9. el 0 vale representa a la carta 10
  10.  */
  11. typedef struct jugador_struct {
  12. int continuar;
  13. int valor;
  14. int offset;
  15. char mano[6];
  16. }jugador;
  17.  
  18. char *mazo = "A234567890JQK";
  19.  
  20. char *crear_baraja(int n);
  21. char *barajar(char *baraja);
  22. int juego(char *bajara,int *offset,int m);
  23. void evaluar_jugador(jugador *j);
  24. int evaluar_carta(char c);
  25. void debug(char *p,int l);
  26.  
  27. int main() {
  28. char *baraja;
  29. int offset = 0;
  30. printf("Juego de BlackJack\n");
  31. printf("Creando bajara...\n");
  32. baraja = crear_baraja(2);
  33. printf("Baraja:\n%s\n",baraja);
  34. printf("Revolver bajara...\n");
  35. baraja = barajar(baraja);
  36. printf("Baraja:\n%s\n",baraja);
  37. juego(baraja,&offset,6); // La casa juega contra 6 Jugadores Solo una ronda, si queremos mas rondas tendremos que agregarlo en un ciclo y controlar el numero de cartas restantes en la baraja
  38. free(baraja);
  39. }
  40.  
  41. char *crear_baraja(int n) {
  42. int i = 0,j;
  43. int offset = 0;
  44. char *cartas;
  45. cartas = calloc(sizeof(char)*52+1,n);
  46. while(i < n) {
  47. j = 0;
  48. while(j < 4) {
  49. memcpy(cartas+offset,mazo,13);
  50. offset+=13;
  51. j++;
  52. }
  53. i++;
  54. }
  55. cartas[offset] = '\0'; //Esta instruccion es incesaria debido a la funcion calloc
  56. return cartas;
  57. }
  58.  
  59. char *barajar(char *baraja) {
  60. int len = strlen(baraja);
  61. char *temp = calloc(len+1,1);
  62. int r;
  63. int i = 0;
  64. /*
  65. Poner su propia funcion random disponible en su sistema
  66. En freeBSD prefiero usar arc4random_uniform
  67. */
  68. while(i < len) {
  69. r = arc4random_uniform(len);
  70. if(baraja[r] != 0) {
  71. temp[i] = baraja[r];
  72. baraja[r] = 0;
  73. i++;
  74. }
  75. }
  76. free(baraja);
  77. return temp;
  78. }
  79.  
  80. int juego(char *bajara,int *offset,int m) {
  81. int len = strlen(bajara);
  82. int i = offset[0],j = 0,k = 0, n = m+1;
  83. jugador **jugadores;
  84. jugadores = calloc(sizeof(jugador*),n);
  85. //memset(jugadores,0,sizeof(jugador)*2);
  86. /* Generamos n jugadores (m jugadores elegidos por el usuario + la casa jugador 0) */
  87. /* Repartimos Cartas a todos los jugadores*/
  88. while(k < n) {
  89. jugadores[k] = calloc(sizeof(jugador),1);
  90. printf("Memoria asignada para el jugador %i @ 0x%X [%i bytes]\n",k,jugadores[k],sizeof(jugador));
  91. k++;
  92. }
  93. while( j < 2 ) {
  94. k = 0;
  95. while(k < n) {
  96. jugadores[k]->mano[j] = bajara[i];
  97. jugadores[k]->offset++;
  98. i++;
  99. k++;
  100. }
  101. j++;
  102. }
  103. /* Funcion de depuracion
  104. debug(jugadores[0],16);
  105. debug(jugadores[1],16);
  106. */
  107. /*
  108. Aqui se ve la mano de cada jugador en el proximo printf dentro del ciclo solo es para fines didacticos
  109. posteriormente solo se evaluan las manos;
  110. */
  111. j = 0;
  112. while( j < n ) {
  113. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  114. evaluar_jugador(jugadores[j]);
  115. printf("Valor actual: %i\n",jugadores[j]->valor);
  116. j++;
  117. }
  118. /*
  119. Despues de repartir las cartas los jugadores juegan y la casa se destapa al final
  120. */
  121. j = 1;
  122. while( j < n ) {
  123. while(jugadores[j]->continuar) {
  124. jugadores[j]->mano[jugadores[j]->offset] = bajara[i];
  125. //printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  126. jugadores[j]->offset++;
  127. evaluar_jugador(jugadores[j]);
  128. i++;
  129. }
  130. j++;
  131. }
  132. /*
  133. Ahora juega la casa.
  134. */
  135. while(jugadores[0]->continuar) {
  136. jugadores[0]->mano[jugadores[0]->offset] = bajara[i];
  137. jugadores[0]->offset++;
  138. evaluar_jugador(jugadores[0]);
  139. i++;
  140. }
  141. /* Mostramos a todos los resultados*/
  142. j = 1;
  143. while( j < n ) {
  144. printf("Jugador: %i\ncartas %s\n",j,jugadores[j]->mano);
  145. printf("Valor actual: %i\n",jugadores[j]->valor);
  146. if(jugadores[j]->valor > 21) {
  147. printf("Perdio\n");
  148. }
  149. else {
  150. if(jugadores[j]->valor == 21) {
  151. printf("Gano BlackJack\n");
  152. }
  153. else {
  154. if(jugadores[0]->valor > 21) {
  155. printf("Gano\n");
  156. }
  157. else {
  158. if(jugadores[j]->valor > jugadores[0]->valor) {
  159. printf("Gano\n");
  160. }
  161. else {
  162. printf("Perdio\n");
  163. }
  164. }
  165. }
  166. }
  167. j++;
  168. }
  169.  
  170. /*
  171. Liberamos memoria de los jugadores
  172. */
  173. while( j < n ) {
  174. free(jugadores[j]);
  175. j++;
  176. }
  177. /*
  178. Retornamos el valor actaul del offset mediante la direccion de memoria del argumento.
  179. y Retornamos el jugador ganador;
  180. */
  181. offset[0] = i;
  182. return 1;
  183. }
  184.  
  185. void evaluar_jugador(jugador *j) {
  186. int i = 0;
  187. char v;
  188. j->valor = 0;
  189. while(j->mano[i] != 0) {
  190. v = evaluar_carta(j->mano[i]);
  191. if(v == 1) {
  192. if((j->valor + 11) <= 21 ) {
  193. j->valor += 11;
  194. }
  195. else {
  196. j->valor += v;
  197. }
  198. }
  199. else {
  200. j->valor += v;
  201. }
  202. if(j->valor <= 16) {
  203. j->continuar = 1;
  204. }
  205. else {
  206. j->continuar = 0;
  207. }
  208. i++;
  209. }
  210. }
  211.  
  212. int evaluar_carta(char c) {
  213. int r = 0;
  214. switch(c) {
  215. case 'A':
  216. r = 1;
  217. break;
  218. case 'K':
  219. case 'Q':
  220. case 'J':
  221. case '0':
  222. r = 10;
  223. break;
  224. case '1':
  225. case '2':
  226. case '3':
  227. case '4':
  228. case '5':
  229. case '6':
  230. case '7':
  231. case '8':
  232. case '9':
  233. r = c - '0';
  234. break;
  235. }
  236. return r;
  237. }
  238.  
  239. void debug(char *p,int l) {
  240. int i = 0;
  241. printf("0x%x\n",p);
  242. while(i < l) {
  243. printf("%.2x",p[i]);
  244. i++;
  245. }
  246. printf("\n");
  247. }
  248.  

Salida completa

Código:
Juego de BlackJack
Creando bajara...
Baraja:
A234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQKA234567890JQK
Revolver bajara...
Baraja:
57A6627296K55Q4Q0073Q2K4J6J297A962AK40350J87754369JJ3JJ7AJQ20828A9A5K0528K8549K9Q0AKK69604487Q38843Q33AQ
Memoria asignada para el jugador 0 @ 0x2880D040 [20 bytes]
Memoria asignada para el jugador 1 @ 0x2880D060 [20 bytes]
Memoria asignada para el jugador 2 @ 0x2880D080 [20 bytes]
Memoria asignada para el jugador 3 @ 0x2880D0A0 [20 bytes]
Memoria asignada para el jugador 4 @ 0x2880D0C0 [20 bytes]
Memoria asignada para el jugador 5 @ 0x2880D0E0 [20 bytes]
Memoria asignada para el jugador 6 @ 0x2880D100 [20 bytes]
Jugador: 0
cartas 52
Valor actual: 7
Jugador: 1
cartas 79
Valor actual: 16
Jugador: 2
cartas A6
Valor actual: 17
Jugador: 3
cartas 6K
Valor actual: 16
Jugador: 4
cartas 65
Valor actual: 11
Jugador: 5
cartas 25
Valor actual: 7
Jugador: 6
cartas 7Q
Valor actual: 17
Jugador: 1
cartas 794
Valor actual: 20
Gano
Jugador: 2
cartas A6
Valor actual: 17
Perdio
Jugador: 3
cartas 6KQ
Valor actual: 26
Perdio
Jugador: 4
cartas 650
Valor actual: 21
Gano BlackJack
Jugador: 5
cartas 250
Valor actual: 17
Perdio
Jugador: 6
cartas 7Q
Valor actual: 17
Perdio
127  Programación / Desarrollo Web / Nube de Google en: 21 Abril 2016, 02:23 am
Estaba viendo que Google ofrece un periodo de prueba para su nube.

La pregunta es ¿Alguno lo a usado? estoy apunto de subir uno de mis proyectos a ella, mi preocupacion es el costo del uso del ancho de banda y el almacenamiento, he visto la calculadora de precios estimados pero me gustaria conocee la experiencia de alguno de ustedes
128  Foros Generales / Foro Libre / ideas para un bot en: 20 Abril 2016, 01:30 am
Estoy programando un nuevo bot, el anterior que hice es un bot para administrar clientes de un programa torrent esro fue un proyecto personal, pero ahora busco un uso mas generico el bot estaria accesible a todo el publico y haria cosas.

Estoy pensando en darle usos informaticos/hacking por ejemplo se me ocurre realizar:
  • Consultas DNS
  • Mostar la salida estandar de Nmap escaneando una IP publica
  • Servir de proxie
  • Mandar mensjaes SMS de Emergencia 1x dia x usuario

Alguna otra idea?

o Mejor aun, que seria util para ustedes recibir de informacion diario en su telefono de forma inmediata.

No lo quiero hacer de noticias ya que ellos abundan.
129  Seguridad Informática / Análisis y Diseño de Malware / Qbot: ¿Mas informacion, ejemplos? en: 14 Abril 2016, 14:42 pm
Estoy leyendo un reporte sobre Qbot suena bastante interesante, ¿alguien tiene mas info sobre las tecnicas utilizadas?

https://threatpost.com/qbot-malware-morphs-quickly-to-evade-detection/117377/
130  Seguridad Informática / Análisis y Diseño de Malware / Decrypter vs Ransomware en: 12 Abril 2016, 02:43 am
Cifrar y descifrar la eterna lucha.

Lista de Decrypter:
  • Petya


Si bien la llegada al Internet de un nuevo malware de la clase de los ransomware no es nada nuevo.

Lo que es motivo de celebrar es que cada vez mas se escucha sobre herramientaa que decrifran los archivos sin nececidad de pagar a los ciber-extorcionadores.

Leyendo hoy las noticias salta que ya hay metodo conocido para recuperar el MBR infectado por PETYA esta.

¿Falla de Petya?
Dejar las llaves de decifrado en el disco duro.

Petya se caracteriza por dejar intactos los archivos pero inhabilitar el acceso a la computadora pidiendo pago a cambio de la clave.

Si bien este tipo de tecnica (alterar el MBR) era mas conocida hace una o dos decadas debido al gran flujo de uso de diskttes ya que eran mas propensos a infectarse de ese tipo de virus de arranque. Pues la tecnica volvio con PETYA, si bien ya sea por flojera de utilizar alguna libreria para el cifrado o facilidad de implementar codigo en ensamblador para modificar el MBR

Se cometio la pereza de dejar la llave en el disco.

¿Como se puede mejorar PETYA?
Implementar algunas rutinas critograficas en ensamblador.
Creo que para este tipo de ransomware no es vital utilizar llaves RSA de gran cantidad de bits asi que implementar algo utilizando una menor cantidad de bits no parace mala idea.

La otra y mas importante es No dejar las llaves en el disco duros si bien este ha sido el talon de Aquiles de muchos ransomwares mal diseñados, parece ser que dada la vida tan corta que tienen los servidores de control dejar las llaves en el disco a sido necesario.
Páginas: 1 2 3 4 5 6 7 8 9 10 11 12 [13] 14 15 16 17 18
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines