招商证券股票day数据格式分析

January 8th, 2012 No comments

今天没事想把招商证券保存的股票数据提取出来, 后来发现招商证券的软件是采用是通达信做的, 这样直接通过查找通达信的数据格式就搞定了.

主要参考: http://alantop.5166.info/gpdatasoft/gpformat/gpformat.htm#_Toc224993378

通达信日线

每条数据文件占32个字节。每四个字节代表一个变量。如下所示:

 

struct stockDay
{
uint32_t date; //日期
uint32_t open; //开盘价,单位:分
uint32_t high; //最高价,单位:分
uint32_t low; //最低价,单位:分
uint32_t close; //收盘价,单位:分
float amount; //交易金额,单位:元
uint32_t vol; //成交量,单位:股
int32_t reserv; //保留,有时用来保存上一交易日收盘价
};

我分别使用C和Go写了个简单的提取程序.

C代码:

#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
struct stockDay
{
uint32_t date; //日期
uint32_t open; //开盘价,单位:分
uint32_t high; //最高价,单位:分
uint32_t low; //最低价,单位:分
uint32_t close; //收盘价,单位:分
float amount; //交易金额,单位:元
uint32_t vol; //成交量,单位:股
int32_t reserv; //保留,有时用来保存上一交易日收盘价
};

void printDay(struct stockDay *day)
{
printf(“日期: %d, “, day->date);
printf(“开盘价: %.2f, 最高价: %.2f, 最低价: %.2f, 收盘价: %.2f, “, day->open/100.0, day->high/100.0, day->low/100.0, day->close/100.0);
printf(“交易金额: %f, 交易量: %d\n”, day->amount, day->vol);
}

int main()
{
FILE *p;
int i = 0;
char *file = “./sh600529.day”;
struct stockDay *day = malloc(sizeof(struct stockDay));

p = fopen(file, “r”);
if (p) {
fseek(p, 0, SEEK_END);
uint64_t iFileLen = ftell(p)/(sizeof(struct stockDay));
rewind(p);
for (i = 0; i < iFileLen; i++) {
memset(day, 0, sizeof(struct stockDay));
fread(day, sizeof(struct stockDay), 1, p);
printDay(day);
}

} else {
printf(“Read File: %s Error!\n”, file);
}

free(day);
fclose(p);
return 0;
}

Go的代码:

package main

import (
“bytes”
“encoding/binary”
“fmt”
“io/ioutil”
“unsafe”
)

type StockDay struct {
date uint32 //日期
open uint32 //开盘价,单位:分
high uint32 //最高价,单位:分
low uint32 //最低价,单位:分
cls uint32 //收盘价,单位:分
amount float32 //交易金额,单位:元
vol uint32 //成交量,单位:股
reserv int32 //保留,有时用来保存上一交易日收盘价
}

func main() {
contents, _ := ioutil.ReadFile(“./sh887001.day”)
//println(string(contents));
var day StockDay
size := int(unsafe.Sizeof(day))
fmt.Printf(“sizeof: %d, days: %d\n”, size, len(contents)/size)
for i := 0; i < len(contents); i += 32 {
buf := bytes.NewBuffer(contents[i : i+4])
err := binary.Read(buf, binary.LittleEndian, &day.date)
if err != nil {
fmt.Println(“binary.Read failed: “, err)
}
buf = bytes.NewBuffer(contents[i+4 : i+8])
err = binary.Read(buf, binary.LittleEndian, &day.open)

buf = bytes.NewBuffer(contents[i+8 : i+12])
err = binary.Read(buf, binary.LittleEndian, &day.high)

buf = bytes.NewBuffer(contents[i+12 : i+16])
err = binary.Read(buf, binary.LittleEndian, &day.low)

buf = bytes.NewBuffer(contents[i+16 : i+20])
err = binary.Read(buf, binary.LittleEndian, &day.cls)

buf = bytes.NewBuffer(contents[i+20 : i+24])
err = binary.Read(buf, binary.LittleEndian, &day.amount)

buf = bytes.NewBuffer(contents[i+24 : i+28])
err = binary.Read(buf, binary.LittleEndian, &day.vol)

fmt.Printf(“%v\n”, day)
}
}

 

代码也贴在Github上: https://gist.github.com/1578661

ps: 目前5分钟线的月份和日期对不上, 不知道哪位高手搞过?

–EOF–

 

golang Byte数组转换为浮点数

January 8th, 2012 No comments

今天没事想用go从文件中提取些二进制数据,并把数据转换为相关的数据类型, 就找到一个把数组转换为float类型的数据。主要用到了encoding/binary包里面的read函数, 它可以根据你数据的大小端得到相关的数据类型。

主要代码如下:

package main

import (
“bytes”
“encoding/binary”
“fmt”
)

func main() {
var pi float64
b := []byte{0×18, 0x2d, 0×44, 0×54, 0xfb, 0×21, 0×09, 0×40}
buf := bytes.NewBuffer(b)
err := binary.Read(buf, binary.LittleEndian, &pi)
if err != nil {
fmt.Println(“binary.Read failed:”, err)
}
fmt.Println(pi)
}

下面是go里面uint32在大小端的分别实现:

bvcom@bvcomtv:~$ godoc -src encoding/binary Uint32
// A ByteOrder specifies how to convert byte sequences into
// 16-, 32-, or 64-bit unsigned integers.
type ByteOrder interface {
Uint32([]byte) uint32
// contains filtered or unexported methods
}

func (littleEndian) Uint32(b []byte) uint32 {
return uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24
}

func (bigEndian) Uint32(b []byte) uint32 {
return uint32(b[3]) | uint32(b[2])<<8 | uint32(b[1])<<16 | uint32(b[0])<<24
}

参考:
Convert 8 byte array to int64? Options:  http://groups.google.com/group/golang-nuts/browse_thread/thread/7f541090fd7d1bd4

Reading byte array as another datatype Options: http://groups.google.com/group/golang-nuts/browse_thread/thread/fc00115bf5b35757

http://golang.org/src/pkg/encoding/binary/binary.go?s=3435:3501#L117

–EOF–

Go 1 will be

January 1st, 2012 No comments

在golang-nuts邮件列表里面, 有人问了有关Go 1的情况, golang的主要开发者Brad Fitzpatrick说: Go 1 相关的库和包, 都已经完成, 节后只修复相关的Bug, 修复完后就会发布Go 1.
如果你想使用可以使用最新Weekly版本2011-12-22, 这个基本上就是Go1 版本.

原文如下:
All the major Go 1 language & library changes are now in. Bug fixing &
polish begins after the holidays, then some release candidates will start
going out. The latest weekly, 2011-12-22 is basically what Go 1 will be,
if you want to start playing.

参考: http://groups.google.com/group/golang-n … 3abf4b868b

Categories: golang Tags: , , , ,

Reaver在10小时之内破解WPA密码

December 29th, 2011 No comments

从Hacker News看到一个WPA破解的工具Reaver,  号称能在10小时之内破解WPA,  晚上回去试试看.

The WiFi Protected Setup protocol is vulnerable to a brute force attack that allows an attacker to recover an access point’s WPS pin, and subsequently the WPA/WPA2 passphrase, in just a matter of hours.

This is something that I’ve been testing and using for a while now, but Stefan over at.braindump beat me to publication. Such is life. :)

Stefan’s code isn’t quite ready for release yet, so I’ve open-sourced Reaver, my WPS attack tool. Reaver is stable and has been tested against a variety of access points and WPS implementations.

Usage is simple; just specify the target BSSID and the monitor mode interface to use:

 

# reaver -i mon0 -b 00:01:02:03:04:05

 

For those interested, there is also a commercial version available with more features and speed improvements.

原文参考: http://www.devttys0.com/2011/12/cracking-wpa-in-10-hours-or-less/

–EOF–

 

Categories: Geek, Security Tags: , , , ,

buildroot编译出错信息

December 20th, 2011 No comments

1. PATH环境变量有当前目录
错误信息:

border@b0rder:/work/tss/src/lichee/buildroot$ ./build.sh -p sun4i -m buildroot

You seem to have the current working directory in your PATH environment variable. This doesn’t work.

make: *** [dependencies] 错误 1

解决方法,

border@b0rder:/work/tss/src/lichee/buildroot$ echo $PATH .:/home/border/bin/jdk1.6.0_26/bin:.:.:/home/border/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/arm-2010.09/bin:/home/border/go/bin://home/border/bin:/usr/local/arm/arm-2009q3/bin:/home/border/bin:/work/vc1000/src/android-vc1000/out/host/linux-x86/bin:/home/border/bin:/home/border/work/depot_tools:/home/border/work/app/google_appengine:/work/vc1000/src/android-vc1000/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:/home/border/work/android/eclipse-x64:/home/border/work/ai/python/:/home/border/work/ai/python/tools

上面的.表示当前目录信息, 去掉. 后才能正常编译。

border@b0rder:/work/tss/src/lichee/buildroot$ export PATH=/home/border/bin/jdk1.6.0_26/bin:/home/border/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/arm-2010.09/bin:/home/border/go/bin://home/border/bin:/usr/local/arm/arm-2009q3/bin:/home/border/bin:/work/vc1000/src/android-vc1000/out/host/linux-x86/bin:/home/border/bin:/home/border/work/depot_tools:/home/border/work/app/google_appengine:/work/vc1000/src/android-vc1000/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:/home/border/work/android/eclipse-x64:/home/border/work/ai/python/:/home/border/work/ai/python/tools border@b0rder:/work/tss/src/lichee/buildroot$ echo $PATH /home/border/bin/jdk1.6.0_26/bin:/home/border/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/arm/arm-2010.09/bin:/home/border/go/bin://home/border/bin:/usr/local/arm/arm-2009q3/bin:/home/border/bin:/work/vc1000/src/android-vc1000/out/host/linux-x86/bin:/home/border/bin:/home/border/work/depot_tools:/home/border/work/app/google_appengine:/work/vc1000/src/android-vc1000/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/bin:/home/border/work/android/eclipse-x64:/home/border/work/ai/python/:/home/border/work/ai/python/tools

2. makeinfo
错误信息:

border@b0rder:/mnt/ubuntu32/work/tss/src/lichee$ ./build.sh -p sun4i -m buildroot

You must install ‘makeinfo’ on your build machine makeinfo is usually part of the texinfo package in your distribution

make: *** [dependencies] 错误 1

解决方法:

sudo apt-get install texinfo

–EOF–