如何将uint64_t值传递给std :: string?我需要构造包含此值的std :: string例如:
void genString(uint64_t val)
{
std::string str;
//.....some code for str
str+=(unsigned int)val;//????
}
Run Code Online (Sandbox Code Playgroud)
谢谢
在Delphi 7中,int64s是签名的,如果我尝试声明一个大于$ 8000000000000000的十六进制常量(例如,什么是uint64)我得到一个错误.你能告诉一些解决方法吗?
我一直在使用std::atollfrom cstdlib将字符串转换为int64_t带有gcc 的字符串.该工具似乎在Windows工具链上不可用(使用Visual Studio Express 2010).什么是最好的选择?
我也有兴趣转换strings成uint64_t.整数定义取自cstdint.
所以基本上我的问题是,我正在创建一个使用uint64_t对象作为键的NSMutableDictionary.
有没有更好的方法来创建它们而不是这样做?
uint64_t bob=7;
NSNumber *bobsNumber;
#if __LP64__ || TARGET_OS_EMBEDDED || TARGET_OS_IPHONE || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
bobsNumber=[NSNumber numberWithUnsignedLong:bob];
#else
bobsNumber=[NSNumber numberWithUnsignedLongLong:bob];
#endif
Run Code Online (Sandbox Code Playgroud)
只要你没有将它包含在二进制文件/套接字/ NSData对象/中,这就可以工作.但有没有更好的方法呢?我真的希望确保对象是64位,无论我在哪个平台上运行它.
我想我可以通过总是无条件的长整数来避免整个问题但当然如果我在任何有效数字中分配这些对象,那么在64位机器上浪费了大量的堆空间....
我正在尝试创建一个通用散列alogrithim,它将字符串散列为64位int.
我能够正确地散列字符串:sql:
select
convert
(
varchar(64),
HASHBYTES
(
'SHA1',
'google.com'
),
2
)
Run Code Online (Sandbox Code Playgroud)
回报 BAEA954B95731C68AE6E45BD1E252EB4560CDC45
C#
System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
System.Text.StringBuilder sb = new StringBuilder();
byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
for (int i = 0; i < b.Length;i++ )
{
byte by = b[i];
sb.Append(by.ToString("x2").ToUpper());
}
return sb.ToString();
Run Code Online (Sandbox Code Playgroud)
retruns BAEA954B95731C68AE6E45BD1E252EB4560CDC45
但是,当我转换为bigint/long时,值不匹配:sql:
select
convert
(
bigint,
HASHBYTES
(
'SHA1',
'google.com'
)
)
Run Code Online (Sandbox Code Playgroud)
回报 2172193747348806725
C#:
System.Security.Cryptography.SHA1 c = System.Security.Cryptography.SHA1.Create();
byte[] b = c.ComputeHash(Encoding.UTF8.GetBytes("google.com"));
return BitConverter.ToInt64(b, 0);
Run Code Online (Sandbox Code Playgroud)
回报 7501998164347841210
有关如何使这些数字匹配的任何想法?
让我们考虑以下情况.
Go例程创建一个字节数组,其中包含8字节Big Endian 的Uint64编号.5577006791947779410[77, 101, 130, 33, 7, 252, 253, 82]
在JavaScript代码中,我收到这些字节为Uint8Array.我们知道JavaScript当前不支持Uint64作为安全数字类型,并且不能对大于32位的整数执行按位运算,所以类似的东西buf[0] << 56永远不会起作用.
那么将这些字节直接解码为数字字符串的过程是什么"5577006791947779410"?
PS我知道在JavaScript中有很多 用于处理大整数的 库,但通常它们很大并且提供了大量的数学运算,这里我不需要.我正在寻找一个简单的现代直接解决方案,只需将BE打包的Uint64和Int64字节解码为数字字符串.你有什么想法吗?
我试过了
sscanf(str, "%016llX", &int64 );
Run Code Online (Sandbox Code Playgroud)
但似乎不安全.是否有快速安全的方式进行型式铸造?
谢谢〜
我意识到这个问题可能取决于处理器,但希望有人可以指出我正确的方向.对于我的生活,我无法弄清楚如何将表示纳秒的无符号long long int转换为表示C中的秒的double(我使用32位big-endian PowerPC 405进行此特定测试,以及GNU C99编译器).
我试过了:
unsigned long long int nanoseconds = 1234567890LLU;
double nanoseconds_d = nanoseconds*1e-9;
Run Code Online (Sandbox Code Playgroud)
也:
nanoseconds_d = ((double) nanoseconds)*1e-9;
Run Code Online (Sandbox Code Playgroud)
对于这两种情况,我只得到0.我在这里做错了什么?
编辑添加完整的例子
#include <stdio.h>
#include <stdlib.h>
int
main( int argc, char *argv[] )
{
unsigned long long int nanoseconds = 1234567890LLU;
double nanoseconds_d = nanoseconds * 1e-9;
printf("%g\n", nanoseconds_d);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
MAKEFILE
SRCS = simple.c
INCLUDE := -I$(PWD)
CFLAGS := -O0 -g3 -Wall -fmessage-length=0 -mhard-float -fsigned-char -D_REENTRANT
LIBS := -lc
OBJS = $(SRCS:.c=.o)
PROG = $(SRCS:.c=).out …Run Code Online (Sandbox Code Playgroud) 假设有一个字符串保存uint64类型变量的地址,我们可以将此地址解析回一个*uint64?
例如:
i := uint64(23473824)
ip := &i
str := fmt.Sprintf("%v", ip)
u, _ := strconv.ParseUint(str, 0, 64)
Run Code Online (Sandbox Code Playgroud)
u是uint64。如何从这个值中取出指针?
游乐场链接:https : //play.golang.org/p/1KXFQcozRk
以下代码的问题:
var x uint64 = 18446744073709551615
var y int64 = int64(x)
Run Code Online (Sandbox Code Playgroud)
是,y是-1.在不丢失信息的情况下,是否可以在这两种数字类型之间进行转换以使用编码器和解码器?
buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)
Run Code Online (Sandbox Code Playgroud)
请注意,在典型情况下,我没有尝试直接数字转换.我更关心的是保持随机数发生器的统计特性.